Подтвердить что ты не робот

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

У нас есть проект P (C/C++ в Linux), состоящий из библиотек lib1, lib2, lib3.

  • lib1 является автономным, связанным с другими общесистемными libs
  • lib2 ссылки на lib1
  • lib3 ссылки на lib1 и lib2

У нас есть каталог P и дополнительные каталоги для каждой из наших библиотек (так, P/lib1/, P/lib2/...). Каждая библиотека также имеет свои собственные тесты.

Вопросы:

  • Как организовать CMakeLists.txt для этого сценария?
  • Следует ли создать только один мастер build или один для каждого lib?
  • Можно ли установить ссылку CMakeLists.txt для STATIC vs. SHARED?
4b9b3361

Ответ 1

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