CMake - 取决于另一个cmake项目

时间:2013-05-23 23:41:16

标签: c++ build cmake

我正在处理的项目具有以下结构:

---Library1
------build
------include
------src
------CMakeLists.txt
---Library2
------build
------include
------src
------CMakeLists.txt
---Executable1
------build
------include
------src
------CMakeLists.txt

Library1是我正在开发的库,需要与Library2链接,后者是第三方库。当我构建Library1时,我需要它自动构建Library2并与之链接。 Executable1需要构建并与Library1建立关联。我不知道如何处理Cmake,我想知道是否有人能引导我朝着正确的方向前进。我想我可能需要使用add_dependencies命令或add_subdirectory,但我不确定如何使用它们并确保它们链接到我的库。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

我认为这里最好的命令可能是add_subdirectory(如您所怀疑的)和target_link_libraries

我想你的目录结构,我希望在根目录中看到一个“顶级”CMakeLists.txt。在该CMake文件中,您将使用add_subdirectory调用子目录的CMakeLists。

我认为Library1Library2都是实际的CMake目标,通过add_library包含在内,同样您拥有add_executable(Executable1 ...)。在这种情况下,您可以将以下内容添加到Library1 / CMakeLists.txt:

target_link_libraries(Library1 Library2)

当指定Library2作为依赖项时,CMake现在会自动链接Library1。如果修改了Library2,则会在再次链接到Library1之前自动重建。{/ p>

同样在Executable1 / CMakeLists.txt中,您可以执行以下操作:

target_link_libraries(Executable1 Library1)

这里唯一要注意的是add_subdirectory命令的顺序需要

add_subdirectory(Library2)
add_subdirectory(Library1)
add_subdirectory(Executable1)

以便在target_link_libraries调用中引用之前定义依赖关系。

对我来说似乎很奇怪的最后一点是每个目标都有一个构建目录。通常只需要一个构建目录(最好在源树之外)。