Multiple library CMakeLists.txt

Multiple library CMakeLists.txt

本文关键字:txt CMakeLists library Multiple      更新时间:2023-10-16

我们有一个项目P(在Linux上C/C++(,由库lib1lib2lib3组成。

  • lib1是独立链接到另一个系统范围的库
  • lib2指向lib1的链接
  • lib3链接到lib1lib2

我们有一个目录 P 和每个库的额外目录(所以,P/lib1/P/lib2/ ...每个库都有自己的测试。

问题:

  • 请问,如何为这种情况组织CMakeLists.txt
  • 我们应该只创建一个主build目录还是为每个库创建一个?
  • 我们可以在CMakeLists.txt中选择STATIC vs. SHARED链接吗?

在这种情况下,我建议使用单个build/目录。CMake 可能会在其中生成单独的 lib1、lib2 和 lib3 目录。

可以使用

BUILD_SHARED_LIBS 标志在静态与共享之间切换(查看add_library文档(

关于CMakeLists.txt组织,选择权在您手中:

  1. 您可以构建单个 CMakeLists.txt其中包含多个add_library条目。这样做的好处是您将获得一个CMakeLists.txt,当项目简单时,有些人可能更喜欢它。

  2. 您可以将项目拆分为多个 CMakeList.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 )