CMAKE - разрешение зависимостей между библиотеками в проекте - PullRequest
2 голосов
/ 30 января 2012

Я использую CMAKE для создания довольно большого проекта, состоящего из множества библиотек и исполняемых файлов. Что-то не так с тем, как я определяю зависимости библиотека-библиотека, и все работает не так, как хотелось бы. Схематично мой проект выглядит так:

CMakeLists.txt
lib1/src/CMakeLists.txt
lib2/src/CMakeLists.txt
app/src/CMakeLists.txt

т.е. У меня есть две библиотеки lib1 и lib2, где lib2 зависит от lib1, а приложение зависит от lib1 и lib2. Я создаю библиотеки, используя как общие, так и статические ссылки:

add_library(lib1_static STATIC lib1_src)
add_library(lib1_shared SHARED lib1_src)
set_target_properties( lib1_static PROPERTIES OUTPUT_NAME lib1)
set_target_properties( lib1_shared PROPERTIES OUTPUT_NAME lib2)

Чтобы убедиться, что зависимости удовлетворены, у меня есть target_link_libraries () как:

#lib2/src/CMakeLists.txt:
target_link_libraries( lib2_shared lib1_shared )
target_link_libraries( lib2_static lib1_static )

А для приложения:

#app/src/CMakeLists.txt
target_link_libraries( app_static lib2_static )   # <- No explicit dependance on lib1
target_link_libraries( app_shared lib2_shared )

Теперь - проблема в том, что когда я делаю новую сборку, она компилируется довольно долго, но при создании файла liblib2.so выдается сообщение об ошибке:

make[2]: *** No rule to make target 'lib1/src/liblib1.so' needed by 'lib2/src/liblib2.so'. Stop.
* Появляется 1015 *. Если я тогда просто введу новую команду make - все будет успешно построено. Так что, похоже, мне не удалось правильно настроить зависимости? Обратите внимание, что вывод make с первой попытки сборки показывает:
Linking C shared library liblib1.so

Итак, сама сборка преуспела - но похоже, что сборка не будет использовать файл liblib1.s0, созданный во время этого экземпляра сборки, для разрешения зависимостей lib2?

Я попытался - и снова удалил - несколько вариантов link_directories () и target_depends () без успеха.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2012

Я использовал CMake версии 2.6 - я обновил до CMake 2.8, и тогда он заработал для меня.

0 голосов
/ 30 января 2012

Кажется, CMake запутался при использовании

set_target_properties( lib1_static PROPERTIES OUTPUT_NAME lib1)

Попробуйте это:

target_link_libraries( lib2_shared lib1 )

или удалите эти настройки свойств.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...