Несколько библиотек CMakeLists.txt

У нас есть проект 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?

person Cartesius00    schedule 12.12.2011    source источник


Ответы (1)


В этом случае я бы рекомендовал использовать один каталог build/. CMake, скорее всего, создаст там отдельные каталоги lib1, lib2 и lib3.

Переключение между STATIC и SHARED можно выполнить с помощью флага BUILD_SHARED_LIBS (проверьте add_library документации)

Что касается организации CMakeLists.txt, выбор за вами:

  1. Вы можете создать один файл CMakeLists.txt, содержащий несколько add_library записей. Преимущество этого заключается в том, что вы получите один файл CMakeLists.txt, который некоторые люди могут предпочесть, когда проекты просты.

  2. Вы можете разделить свой проект на несколько файлов 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 )
person André    schedule 12.12.2011