2012-01-30 5 views
2

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

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

I.e. У меня есть две библиотеки 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) 

Для того, чтобы dependies удовлетворены меня 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. 

появляется. Если я тогда просто выдаю новую команду make - все будет успешно сработано. Похоже, мне не удалось правильно настроить зависимости? Обратите внимание, что вывод делает с первой попыткой сборки показывает:

Linking C shared library liblib1.so 

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

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

Благодарен за любые советы?

Йоаким

ответ

0

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

set_target_properties(lib1_static PROPERTIES OUTPUT_NAME lib1) 

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

target_link_libraries(lib2_shared lib1) 

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

+0

ОК - спасибо за ответ; как уже упоминалось, я решил решить его, обновив CMake. Но я чувствую, что все статическое/разделяемое обращение в моем CMakeLists.txt довольно сложно - поэтому, возможно, я могу упростить это, как вы предлагаете. – user422005

0

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