使用CMake添加不在子目录中的依赖项

Sig*_*erm 17 cmake

假设有以下目录结构:

root
  |
  +--projects
  |      |
  |      +-test
  |         |
  |         +-CMakeFiles.txt
  |
  +--libs
       |
       +-testlib
            |
            +-CMakeFiles.txt
Run Code Online (Sandbox Code Playgroud)

test包含CMakeFiles.txttestlib包含CMakeFiles.txt."test"生成可执行文件,"testlib"生成静态库.

我希望"test"与"testlib"链接,而不使用符号链接,也不需要将"testlib"库移动到"test"中的子目录中.

因为"testlib"不是"test"的子目录,所以我不能这样做

add_subdirectory("../../libs/testlib")
Run Code Online (Sandbox Code Playgroud)

在测试中CMakeFiles.txt- CMake会抱怨"testlib"不在"test"子目录中.

另外,因为系统有几个不同的编译器,我不能简单地将"testlib"库安装到某种中心目录中,所以我想test编译一个本地副本testlib并与之链接(即好像testlib是一个子目录).我还希望"test"项目能够自动重建"testlib"(如果已经更改).

那么,我该如何处理呢?我在Windows XP SP3上使用CMake 2.8.4.

Fra*_*ser 21

您可以在其中提供顶级CMakeLists.txt root,也可以为add_subdirectory命令提供二进制目录; 例如

add_subdirectory("../../libs/testlib" "${CMAKE_CURRENT_BINARY_DIR}/testlib_build")
Run Code Online (Sandbox Code Playgroud)

这将创建一个testlib_build在当前构建目录中调用的子目录,该子目录包含为testlib生成的项目文件,但不包含源.

有关详细信息,请运行

cmake --help-command ADD_SUBDIRECTORY
Run Code Online (Sandbox Code Playgroud)


arr*_*owd 14

我看到这样做的唯一方法 - CMakeLists.txt在root中创建并在其中放入以下代码:

add_subdirectory(projects/test)
add_subdirectory(lib/testlib)
Run Code Online (Sandbox Code Playgroud)

当你这样做,你可以做target_link_libraries(test testlib)test/CMakeLists.txt,它将如果你改变的东西自动重建testlib.