У нас есть проект P (C/C++ в Linux), состоящий из библиотек lib1, lib2, lib3.
lib1 является автономным, связанным с другими общесистемными библиотеками.
lib2 ссылки на lib1
lib3 ссылается как на lib1, так и на lib2
У нас есть каталог P и дополнительные каталоги для каждой из наших библиотек (таким образом, P/lib1/, P/lib2/...). Каждая библиотека также имеет свои собственные тесты.
Вопросы:
- Пожалуйста, как организовать
CMakeLists.txt для этого сценария?
- Должны ли мы создавать только один главный каталог
build или по одному для каждой библиотеки?
- Можем ли мы иметь вариант в
CMakeLists.txt для связи STATIC vs. SHARED?
Ответ 1 · рейтинг 29 · André
В этом случае я бы рекомендовал использовать один каталог build/. CMake, скорее всего, создаст там отдельные каталоги lib1, lib2 и lib3.
Переключение между STATIC и SHARED можно выполнить с помощью флага BUILD_SHARED_LIBS (проверьте add_library документации)
Что касается организации CMakeLists.txt, выбор за вами:
Вы можете создать один файл CMakeLists.txt, содержащий несколько add_library записей. Преимущество этого заключается в том, что вы получите один файл CMakeLists.txt, который некоторые люди могут предпочесть, когда проекты просты.
Вы можете разделить свой проект на несколько файлов CMakeLists.txt, распределенных по вашим каталогам lib1, lib2 и lib3, и использовать корневой файл cmakelists.txt с add_subdirectory. Преимущество этой настройки заключается в том, что будет проще генерировать файлы сборки одним вызовом (в вашем каталоге build/), но затем вы можете легко перейти, например. lib3/ и вызвать туда make/msbuild. CMake гарантирует правильность построения зависимостей.
Пример 1:
project( P )
# Setup lib1
set ( LIB1_SOURCES ... ) # Fill in your set of source-files here...
add_library( lib1 ${LIB1_SOURCES} )
# Do similar for lib2 and lib3
target_link_libraries( lib2 lib1 ) # Indicate that lib1 is needed for lib2
target_link_libraries( lib3 lib1 lib2 ) # Indicate that lib2 and lib1 are needed for lib3
Пример 2:
project( P )
add_subdirectory( lib1 )
add_subdirectory( lib2 )
add_subdirectory( lib3 )
Затем в каждом подкаталоге вы записываете свой CMakeLists.txt. Например. в случае lib3:
project( lib3 )
set( LIB3_SOURCES ... ) # Setup the list of sources here.
add_library( lib3 ${LIB3_SOURCES} )
# You can refer to other libraries which should be available from the root cmakelists.
target_link_libraries( lib3 lib1 lib2 )