多个嵌套项目和库的CMake脚本和目录结构

时间:2017-05-24 07:13:26

标签: c++ cmake

我想知道为使用cmake构建的多个依赖c ++项目制作目录结构的最佳方法是什么,以及在这种情况下cmake脚本应该如何。 (如果重要的话,我会在linux下使用gcc。)

我有多个独立项目AB。我还有多个库XY

当这些库由其他开发人员制作时没有问题。我可以使用现有的FindX.cmake或写自己来跟踪它们。

XY是我自己的库时出现问题。让A取决于XY,项目B取决于Y。此外,让Y取决于X(因为我重用了一些常见的,而不是任务相关的代码)。但是我假设可以有更多的库,项目和更深的嵌套深度。第二个假设是库(例如X)不仅可以提供像* .so这样的库,还可以提供一些可执行文件(不仅用于测试)。

当我重建我的项目时,我想重建所有依赖项,因为我可以同时在项目和库中进行修改。此外,我想将库彼此分开,并为我的所有项目创建一个目录code,其中包含4个子目录:~/code/A~/code/B~/code/X,{{ 1}}。每个项目都有自己的测试,并将被推送到单独的代码库中。

我发现有关构建正确目录结构的最佳链接是thisthis。但是作者建议创建嵌套的目录结构,这在我的例子中似乎很难做到,因为如果我这样做,我将最终得到这样的目录结构:

~/code/Y

我可以通过使用符号链接获得。但是在我的单独目录中,为每个项目编译了二进制文件(A/X A/Y/X B/Y/X A/buildB/buildX/build)我会从不同的库中获得库和可执行文件的副本。如果我为所有版本调用Y/build,那么由于二进制文件和库的重复,这些副本会造成混乱。

更新(解决方案):

答案恰好相当简单,经过几天的cmake和阅读文档试验后我发现了它。

  1. Libray 即可。接下来两行:

    make install
    • 第一行将在export(PACKAGE <pkgName>) export(TARGETS <libTarget> FILE <pkgName>Config.cmake) 中创建条目,该条目将告知库的构建目录所在的位置。其他项目中的Cmake调用从该路径开始搜索。

    • 第二行将在构建目录中创建~/.cmake/packages/

  2. 可执行即可。添加下一行:

    Find<pkgName>.cmake

    因此,如果没有构建库,我们会看到错误消息,否则我们将能够使用目标find_package(<pkgName> QUIET) if(${<pkgName>_FOUND}) message(STATUS "Found <pkgName>.") else(${<pkgName>_FOUND}) message(FATAL_ERROR "Could not locate <pkgName>!") endif(${<pkgName>_FOUND})

  3. 当然,如果在库源中进行了一些更改,构建可执行文件不会触发重建库。为了解决这个问题,我编写了bash脚本,首先在库中调用<libTarget>,然后在可执行构建目录中调用。{/ p>

    P上。 S.如果你知道更好的解决方案,我还在等待它。

1 个答案:

答案 0 :(得分:0)

我个人使用的是这样的

~/my_project
~/my_project/src
~/my_project/src/A
~/my_project/src/B
~/my_project/src/X
~/my_project/src/Y

CMakeLists.txt使用add_subdirectory添加src目录。 src/CMakeLists.txt依次使用add_subdirectory添加ABXY

通过CMakeLists.txt文件中正确设置的依赖关系,CMake将正确处理依赖关系,并重建所需的一切(因此,如果您在X然后Y进行更改,{{1应该正确重建和A。)