C++ 多库CMakeLists.txt

C++ 多库CMakeLists.txt,c++,c,cmake,C++,C,Cmake,我们有一个项目p(Linux上的C/C++),由库lib1,lib2,lib3组成 lib1独立链接到另一个系统范围的libs lib2链接到lib1 lib3链接到lib1和lib2 我们有一个目录p和每个lib的额外目录(因此,p/lib1/,p/lib2/…)。每个库都有自己的测试 问题: 请问,如何组织此场景的CMakeLists.txt 我们应该只创建一个主build目录还是为每个库创建一个主目录 我们能否在CMakeLists.txt中为静态链接与共享链接提供一个选项 在这种情

我们有一个项目p(
Linux上的C/C++
),由库
lib1
lib2
lib3
组成

  • lib1
    独立链接到另一个系统范围的libs
  • lib2
    链接到
    lib1
  • lib3
    链接到
    lib1
    lib2
我们有一个目录p和每个lib的额外目录(因此,
p/lib1/
p/lib2/
…)。每个库都有自己的测试

问题:

  • 请问,如何组织此场景的
    CMakeLists.txt
  • 我们应该只创建一个主
    build
    目录还是为每个库创建一个主
    目录
  • 我们能否在
    CMakeLists.txt
    中为
    静态链接与共享链接提供一个选项

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

可以使用BUILD_SHARED_LIBS标志在静态和共享之间切换(查看文档)

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

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

  • 您可以将项目拆分为多个分布在lib1、lib2和lib3目录上的CMakeLists.txt,并使用根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
    
    例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 )