FireBreath Mac OS X Foundation

Я получаю ошибку ссылки на сборку 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 следующим образом:

  1. В навигаторе проекта выберите проект.
  2. Выберите цель.
  3. Выберите вкладку «Build Phases».
  4. Откройте расширитель «Связать двоичные файлы с библиотеками» (возможно, вам придется использовать
    «Добавить этап сборки»).
  5. Нажмите кнопку «+» один раз, чтобы добавить каждую из рамок.

После добавления фреймворков через 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.

0

Решение

Просто сделать 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.

2

Другие решения

Других решений пока нет …