2013-06-12 2 views
5

У меня есть вопрос, связанный с CMake в MAC. Я убеждаюсь, что исполняемая программа свяжет рамки и библиотеки правильно со следующими кодами:Почему я не могу связать файл рамки Mac с CMake?

link_directories(directory_to_framework_and_libs) 
add_executable(program ${FILE_LIST}) 
target_link_libraries(program framework_name lib1 lib2) 

В первой строке коде, я обозначаю место, где исполняемая программа может выполнять поиск рамок и библиотеки. В коде третьей строки инфраструктура и библиотеки будут ссылаться на исполняемую программу. Однако, когда я компилирую xcode.project, созданный из файла cmake с помощью Xcode 4, проект продолжает жаловаться на то, что он не может найти -lframework_name: ld: library not found -lframework_name Любые идеи будут оценены.

+2

Трудно сказать, что здесь не так, без особых деталей. В принципе, это кажется правильным. Однако я бы рекомендовал избегать использования ['link_directories'] (http://www.cmake.org/cmake/help/v2.8.11/cmake.html#command:link_directories) (дополнительную информацию см. В документах) и вместо этого используйте ['find_library'] (http://www.cmake.org/cmake/help/v2.8.11/cmake.html#command:find_library). Это позволит вам передать полный путь к библиотеке в вызове 'target_link_libraries', и если библиотека не была найдена, вы получите сообщение об ошибке в настройке времени CMake, а не во время соединения. – Fraser

ответ

15

Вы не можете ссылаться на инфраструктуру таким образом, вы должны использовать find_library, так как она включает в себя некоторую специальную обработку для фреймворков на OSX.

Кроме того, не используйте link_directories, CMake использует полные пути к библиотекам, и это не нужно.

Вот несколько простых примеров с AudioUnit:

find_library(AUDIO_UNIT AudioUnit) 
if (NOT AUDIO_UNIT) 
    message(FATAL_ERROR "AudioUnit not found") 
endif() 

add_executable(program ${program_SOURCES}) 
target_link_libraries(program ${AUDIO_UNIT}) 
+1

Ваш 'if not (...)' должен быть 'if (NOT ...)' Я думаю. – Fraser

+0

действительно ... спасибо :) – Guillaume

+0

@Guillaume Спасибо, и теперь это работает. – feelfree

11

Другое решение заключается в следующем:

target_link_libraries(program "-framework CoreFoundation") 
target_link_libraries(program "-framework your_frame_work_name) 
set_target_properties(program PROPERTIES LINK_FLAGS "-Wl,-F/Library/Frameworks") 
5

Вам не нужно все это хлопот (по крайней мере, с CMake 2.8.12).

Это прекрасно работает:

target_link_libraries(program stdc++ "-framework Foundation" "-framework Cocoa" objc) 

Когда CMake видит параметр линии связи, начиная с «-», это не PREPEND «-l» и передает аргумент как есть линкер (/ USR/бен/C++).

Вам нужны кавычки для фреймворков, чтобы CMake рассматривал два слова как одну запись и не добавлял, например, -l перед «Foundation».

Смежные вопросы