Я использую 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() без успеха.
Благодарен за любые советы?
Йоаким
ОК - спасибо за ответ; как уже упоминалось, я решил решить его, обновив CMake. Но я чувствую, что все статическое/разделяемое обращение в моем CMakeLists.txt довольно сложно - поэтому, возможно, я могу упростить это, как вы предлагаете. – user422005