2011-12-12 71 views
12

我们有一个项目P(在Linux上为C/C++),它由库lib1,lib2,lib3组成。多库CMakeLists.txt

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

我们有一个目录P和额外的目录为每我们的库(so,P/lib1/P/lib2/ ...)。每个图书馆都有自己的考试。

问题:

  • 请,如何组织CMakeLists.txt对于这种情况?
  • 我们应该只创建一个主文件夹build或每个文件夹一个?
  • 我们可以在CMakeLists.txt连接STATIC vs. SHARED有一个选项吗?

回答

22

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

STATIC之间的交换与共享关系可以用BUILD_SHARED_LIBS标志来完成(检查add_library文档)

关于组织的CMakeLists.txt,选择是你的:

  1. 你可以构建一个具有多个add_library条目的CMakeLists.txt。 这有一个好处,你会得到一个单一的CMakeLists.txt,当项目很简单时,有些人可能会喜欢。

  2. 您可以将您的项目拆分为分布在lib1,lib2和lib3目录中的多个CMakeLists.txt,并使用与add_subdirectory一起使用的根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) 
+0

太好了,谢谢。 – Cartesius00

相关问题