Ошибки компоновщика в проекте Objective-C++ Metal

Я на El Capitan и создал новый проект через Xcode, где я выбрал OS X -> Application -> Game (Language: Objective-C, Game Technology: Metal)

Изначально проект компилируется и запускается без проблем.

Затем я переименовываю главный контроллер представления GameViewController.m в GameViewController.mm, чтобы использовать Objective-C++. Когда я строю сейчас, я получаю следующие ошибки компоновщика:

Неопределенные символы для архитектуры x86_64: "_MTKMetalVertexDescriptorFromModelIO", на который ссылается: -[GameViewController _loadAssets] в GameViewController.o "_OBJC_CLASS_$_MDLMesh", на который ссылается: objc-class-ref в GameViewController.o "_OBJC_CLASS_$_MTKMesh", на который ссылается: objc -class-ref в GameViewController.o "_OBJC_CLASS_$_MTKMeshBufferAllocator", ссылка из: objc-class-ref в GameViewController.o ld: символы не найдены для архитектуры x86_64

Я пробовал обернуть заголовки Metal в extern "C" {}, но это не помогло.

Как я могу заставить его строить?


person Fszczemton    schedule 10.01.2016    source источник
comment
Похоже, вам не хватает MetalKit(?). Попробуйте добавить его в раздел Frameworks целевых настроек и посмотрите, поможет ли это.   -  person KirkSpaziani    schedule 11.01.2016
comment
Я думал, что это не сработает, так как он хорошо скомпилирован с файлом .m. Но да, после изменения на .mm и добавления MetalKit, Metal и ModelIO он снова компилируется. @KirkSpaziani - не могли бы вы добавить ответ на вопрос, чтобы я мог пометить его как принятый?   -  person Fszczemton    schedule 11.01.2016
comment
Когда я переименовал GameViewController.m в GameViewController.mm, я получил: use of '@import' when modules are disabled.   -  person Cy-4AH    schedule 14.01.2016


Ответы (1)


Причина в том, что в Objective-C есть относительно новая функция, благодаря которой включение заголовка автоматически добавляет фреймворк в вашу команду ссылки. В проектах шаблонов, предоставленных Apple, эта функция включена по умолчанию. Следовательно, список фреймворков в настройках сборки пуст. Изменив язык на Objective-C++, вы ушли от этой функции и должны вручную добавить структуру.

person Mustang    schedule 14.01.2016
comment
Название параметра — «Связывать платформы автоматически», и оно не решает проблему, даже если остается активным. (Это правда, что я изменил другие настройки, такие как диалект языка С++ на С++ 17) - person Liviu; 07.12.2017