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