多个库CMakeLists.txt

时间:2011-12-12 12:51:35

标签: c++ c cmake

我们有一个项目P(Linux上为C/C++),包含库lib1lib2lib3

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

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

问题:

  • 请问,如何为此方案组织CMakeLists.txt
  • 我们应该只创建一个主build目录,还是每个lib创建一个目录?
  • 我们可以在CMakeLists.txt中为STATIC vs. SHARED链接提供选项吗?

1 个答案:

答案 0 :(得分:26)

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

使用BUILD_SHARED_LIBS标志(检查add_library文档)

可以在STATIC与SHARED之间切换

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

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

  2. 您可以将项目拆分为多个分布在lib1,lib2和lib3目录上的CMakeLists.txt,并使用带有add_subdirectory的root cmakelists.txt。这种设置的好处是,通过一次调用(在您的构建/目录中)生成构建文件会更容易,但您可以轻松地进入例如lib3 /并在那里调用make / msbuild。 CMake将确保正确构建依赖关系

  3. 示例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 )