Я получаю ошибку ссылки на сборку Mac моего плагина FireBreath, которая выглядит следующим образом:
Undefined symbols for architecture x86_64:
"_IOIteratorNext", referenced from:
MyFunction(...) in MyFile.o
Пожалуйста, помогите мне решить эту ошибку ссылки.
У меня есть похожие ошибки для "_IOObjectRelease", "_IORegistryEntryCreateCFProperty", "_IORegistryEntryGetParentEntry", "_IOServiceGetMatchingServices", "_IOServiceMatching", and "_kIOMasterPortDefault"
,
Это наводит меня на мысль, что мне нужно включить Frameworks IOKIT и COREFOUNDATION.
Я пришел к выводу, что это именно те фреймворки, которые мне нужны, потому что я могу временно добиться успеха при сборке, добавив их непосредственно в Xcode следующим образом:
После добавления фреймворков через Xcode сборка завершается успешно. Однако после повторного запуска подготовительного сценария prepmac.sh фреймворки теряются и сборка завершается неудачно.
Я попытался добавить Frameworks через FireBreath несколькими способами, отредактировав PluginConfig.cmake и Mac / projectDef.cmake, и даже подумал об изменении CMakeLists.txt, но это кажется менее многообещающим.
Я попробовал следующие утверждения в различных комбинациях в двух .cmake
файлы, но я не уверен, где их разместить:
find_library(IOKIT_FRAMEWORK IOKit)
message("Finding library IOKit: ${IOKIT_FRAMEWORK}")
find_library(COREFOUNDATION_FRAMEWORK CoreFoundation)
message("Finding library CoreFoundation: ${COREFOUNDATION_FRAMEWORK}")
target_link_libraries(${PROJECT_NAME}
${COREFOUNDATION_FRAMEWORK}
${IOKIT_FRAMEWORK}
${PLUGIN_INTERNAL_DEPS}
)
Кажется, что ни одно из изменений не меняет журнал сборки.
Конечно, я генерирую проект между изменениями с «prepmac.sh», в котором сообщается о новых утверждениях ‘message’:
Finding library IOKit: /System/Library/Frameworks/Cocoa.framework
Finding library CoreFoundation: /System/Library/Frameworks/CoreFoundation.framework
Решение:
Основываясь на совете Taxilian, решение заключалось в том, чтобы правильно указать правильные Frameworks в Mac / projectDef.cmake, полностью удалить каталог сборки и переделать его с нуля с помощью скрипта prepmac.sh.
Просто сделать find_library недостаточно, чтобы сделать его ссылкой; вам также нужно добавить его в вызов target_link_libraries. Также вы должны убедиться, что ваш случай соответствует самим библиотекам; Я не знаю, имеет ли это значение для Mac, но это хорошая практика, если это чувствительная к регистру файловая система (и да, это возможно для Mac).
Правильный случай для фреймворков «IOKit» и «CoreFoundation»
Вы можете найти больше информации о том, как сделать это правильно на Использование библиотек страница на firebreath.org. Попробуйте что-то вроде этого:
find_library(IOKIT_FRAMEWORK IOKit)
find_library(COREFOUNDATION_FRAMEWORK CoreFoundation)
target_link_libraries(${PROJECT_NAME} ${COREFOUNDATION_FRAMEWORK} ${IOKIT_FRAMEWORK})
Обратите внимание, что это должно быть где-то в вашем файле Mac / projectDef.cmake после вызов add_mac_plugin.
Других решений пока нет …