2015-07-15 3 views
0

I Ubuntu, я узнал о cmake и make и просто попробовал простой пример. У меня есть два каталога: src и build. В src, у меня есть три файла: main.cpp, camera.hpp и CMakeLists.txt, который имеет (только) следующий текст:Cmake не правильно добавляет каталоги с помощью «target_link_directory»

add_executable(test main.cpp) 
target_link_directory(/home/karnivaurus/Libraries) 
target_link_libraries(test Camera) 

В /home/karnivaurus/Libraries я разделяемая библиотека называется libCamera.so, который я хочу связать с. Мой main.cpp использует функции в этой библиотеке, которые объявлены в camera.hpp.

Теперь, в моем каталоге build, я запускаю cmake ../src, а затем make. Тем не менее, я получаю ошибки компоновщика, говорящие мне, что есть неопределенные ссылки на некоторые из функций в моей библиотеке. Если я выполнил поиск по всем файлам и подкаталогам в build, не упоминается libCamera.so.

Однако, если я удалить target_link_directory строки в моем CMakeLists.txt файле, и вместо того, чтобы писать полный путь к библиотеке при указании исполняемого, то есть target_link_libraries(test /home/karnivaurus/Libraries/libCamera.so), он собирает и связывает хорошо.

Почему именно target_link_directory не работает должным образом?

ответ

0

Я никогда не видел target_link_directory и не нашел соответствующую документацию в руководстве CMake.

Если вы хотите связать с libCamera.so в /home/username/Libraries, вы можете просто написать CMakeLists.txt так:

add_executable(main main.cpp) 
target_link_libraries(main /home/username/Libraries/libCamera.so) 

Если вы много библиотек, которые вы хотите связать с, вы можете рассмотреть возможность использования find_library, который принимает PATHS опция. Что-то вроде этого:

find_library(MY_CAMERA_LIBRARY Camera PATHS /home/username/Libraries) 
message(STATUS "MY_CAMERA_LIBRARY: " ${MY_CAMERA_LIBRARY}) 
target_link_libraries(main ${MY_CAMERA_LIBRARY}) 

переменная MY_CAMERA_LIBRARY будет установлен полный путь к вашему libCamera.so.

1

Используйте команду link_directories() вместо target_link_directories() (который не существует):

add_executable(test main.cpp) 
link_directories(/home/karnivaurus/Libraries) 
target_link_libraries(test Camera) 

ПРИМЕЧАНИЕ: Мой CMake выдается сообщение об ошибке, когда он увидел команду target_link_directory() я удивляюсь, почему вы не видели (CMake 2.8.12).

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