2013-02-12 8 views
0

Я получаю ошибку ссылку на Mac сборки моего FireBreath плагин ищет, как это:FireBreath Mac OS X Foundation

Undefined symbols for architecture x86_64: 
    "_IOIteratorNext", referenced from: 
     MyFunction(...) in MyFile.o 

Пожалуйста, помогите мне решить эту ошибку связи.

У меня есть подобные ошибки для "_IOObjectRelease", "_IORegistryEntryCreateCFProperty", "_IORegistryEntryGetParentEntry", "_IOServiceGetMatchingServices", "_IOServiceMatching", and "_kIOMasterPortDefault". Это заставляет меня думать, что мне нужно включить Framework IOKIT и COREFOUNDATION.

я пришел к выводу, что эти рамочные, что мне нужно, потому что я могу временно получить сборки, чтобы добиться успеха, добавив их непосредственно в Xcode, как это:

  1. В навигаторе проекта выберите проект.
  2. Выберите цель.
  3. Выберите вкладку «Построить фазы».
  4. Открыть расширитель 'Link Binaries With Libraries' (Возможно, вам придется использовать 'Add Build Phase').
  5. Нажмите кнопку «+» один раз, чтобы добавить каждую из рамок.

После добавления рамок через Xcode сборка завершается успешно. Однако после повторного запуска сценария подготовки prepmac.sh Frameworks теряются, и сборка завершается с ошибкой.

Я попытался добавить 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», в которой новые заявления «сообщение» сообщают:

Finding library IOKit: /System/Library/Frameworks/Cocoa.framework 
Finding library CoreFoundation: /System/Library/Frameworks/CoreFoundation.framework 

Решение: на основе рекомендаций taxilian решения было чтобы правильно указать правильные рамки в Mac/projectDef.cmake и полностью удалить каталог сборки и переделать его с нуля с помощью сценария prepmac.sh.

ответ

2

Просто сделать find_library недостаточно, чтобы сделать ссылку; вам также нужно добавить его в вызов target_link_libraries. Также вы должны убедиться, что ваш случай соответствует самим библиотекам; Я не знаю, имеет ли это значение или нет на Mac, но это хорошая практика, если это файловая система, чувствительная к регистру (и да, возможно, на Mac).

Правильное место для рамок является «IOKit» и «CoreFoundation»

Вы можете найти более подробную информацию о том, как правильно это сделать на странице Using Libraries на 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» вызов.

+0

Уважаемый налогоплательщик, Спасибо за ваш быстрый ответ! Да, я уже добавлял фреймворки в «get_link_libraries», но мои команды «find_library» не были раньше «add_mac_plugin», и случай с именами моих фондов не соответствовал вашим предложениям. Однако эти изменения не помогли. Обратите внимание, что я догадался об именах фреймов, поэтому они вряд ли будут точно верны. Какие-нибудь дальнейшие идеи? –

+1

добавьте строку, которая выглядит так: message («Поиск библиотеки IOKit: $ {IOKIT_FRAMEWORK}») - это покажет вам, находила ли она библиотеку. если это не так, вам нужно выяснить, почему нет – taxilian

+0

prepmac.sh, похоже, нашел их обоих: Поиск библиотеки IOKit: /System/Library/Frameworks/Cocoa.framework Поиск библиотеки CoreFoundation:/System/Library/Каркасы/CoreFoundation.framework. Я не уверен, что это те основы, которые мне нужны для конкретных ошибок Link. –