Ответ 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 )