Я использую 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 () без успеха.