CMake - 取决于另一个 cmake 项目

Bra*_*rad 3 c++ build cmake

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

---Library1
------build
------include
------src
------CMakeLists.txt
---Library2
------build
------include
------src
------CMakeLists.txt
---Executable1
------build
------include
------src
------CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)

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

Fra*_*ser 5

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

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

我想这两个Library1Library2是实际的CMake的目标,通过包括add_library,同样你add_executable(Executable1 ...)。在这种情况下,您可以将以下内容添加到 Library1/CMakeLists.txt:

target_link_libraries(Library1 Library2)
Run Code Online (Sandbox Code Playgroud)

CMake 现在会Library2Library1被指定为依赖项时自动链接。如果Library2被修改,那么它会在Library1再次链接之前自动重建。

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

target_link_libraries(Executable1 Library1)
Run Code Online (Sandbox Code Playgroud)

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

add_subdirectory(Library2)
add_subdirectory(Library1)
add_subdirectory(Executable1)
Run Code Online (Sandbox Code Playgroud)

以便在调用中引用它们之前定义依赖项target_link_libraries

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