Несколько библиотек CMakeLists.txt - PullRequest
16 голосов
/ 12 декабря 2011

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

26 голосов
/ 12 декабря 2011

В этом случае я бы рекомендовал использовать один каталог 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 )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...