多个库CMakeLists.txt

Car*_*s00 19 c c++ cmake

我们有一个项目P(C/C++在Linux上)由图书馆lib1,lib2,lib3.

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

我们有一个目录P和每个libs的额外目录(所以P/lib1/,P/lib2/...).每个图书馆都有自己的测试.

问题:

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

And*_*dré 28

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

使用BUILD_SHARED_LIBS标志可以在STATIC与SHARED之间切换(查看add_library文档)

关于CMakeLists.txt组织,您可以选择:

  1. 您可以构建一个具有多个add_library条目的CMakeLists.txt .这样做的好处是,您将获得一个CMakeLists.txt,当项目很简单时,有些人可能会喜欢.

  2. 您可以将项目拆分为多个分布在lib1,lib2和lib3目录上的CMakeLists.txt,并使用带有add_subdirectory的root cmakelists.txt .这个设置的好处是,通过一次调用(在你的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
Run Code Online (Sandbox Code Playgroud)

例2:

project( P )
add_subdirectory( lib1 )
add_subdirectory( lib2 )
add_subdirectory( lib3 )
Run Code Online (Sandbox Code Playgroud)

然后在每个子目录中编写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 )
Run Code Online (Sandbox Code Playgroud)