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

时间:2012-04-04 02:18:37

标签: cmake

假设有以下目录结构:

root
  |
  +--projects
  |      |
  |      +-test
  |         |
  |         +-CMakeFiles.txt
  |
  +--libs
       |
       +-testlib
            |
            +-CMakeFiles.txt

test包含CMakeFiles.txttestlib也包含CMakeFiles.txt。 “test”生成一个可执行文件,“testlib”生成一个静态库。

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

因为“testlib”不是“test”的子目录,所以我无法做到

add_subdirectory("../../libs/testlib")

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

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

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

2 个答案:

答案 0 :(得分:19)

您可以在root中提供顶级CMakeLists.txt,或者为add_subdirectory命令提供二进制目录; e.g。

add_subdirectory("../../libs/testlib" "${CMAKE_CURRENT_BINARY_DIR}/testlib_build")

这将在您当前的构建目录中创建一个名为testlib_build的子目录,其中包含为testlib生成的项目文件,但不包含源。

有关详细信息,请运行

cmake --help-command ADD_SUBDIRECTORY

答案 1 :(得分:13)

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

add_subdirectory(projects/test)
add_subdirectory(lib/testlib)

完成此操作后,您可以在target_link_libraries(test testlib)中执行test/CMakeLists.txt,如果您在testlib中更改内容,则会自动重建。{/ p>