多个嵌套项目和库的CMake脚本和目录结构 < >我想知道什么是最好的方法来为多个依赖的C++项目创建目录结构,这些项目是使用CMADE构建的,在这种情况下,CaseScript应该是什么样子。(如果重要的话,我可以在linux和gcc中使用它。)

多个嵌套项目和库的CMake脚本和目录结构 < >我想知道什么是最好的方法来为多个依赖的C++项目创建目录结构,这些项目是使用CMADE构建的,在这种情况下,CaseScript应该是什么样子。(如果重要的话,我可以在linux和gcc中使用它。),c++,cmake,C++,Cmake,我有多个独立的项目A,B。我还有多个库X,Y 当这些库由其他开发人员创建时,没有问题。我可以使用现有的FindX.cmake或编写own来跟踪它们 当X,Y是我自己的库时,问题就出现了。让A依赖于X和Y,项目B依赖于Y。此外,letY依赖于X(因为我重用了一些常见的、与任务无关的代码)。然而,我假设可以有更多的库、项目和更深入的嵌套。第二个假设是,库(X)不仅可以提供类似*.so的库,还可以提供一些可执行文件(不仅用于测试) 重建项目时,我希望重建所有依赖项,因为我可以同时在项目和库中进行修改。

我有多个独立的项目
A
B
。我还有多个库
X
Y

当这些库由其他开发人员创建时,没有问题。我可以使用现有的
FindX.cmake
或编写own来跟踪它们

X
Y
是我自己的库时,问题就出现了。让
A
依赖于
X
Y
,项目
B
依赖于
Y
。此外,let
Y
依赖于
X
(因为我重用了一些常见的、与任务无关的代码)。然而,我假设可以有更多的库、项目和更深入的嵌套。第二个假设是,库(
X
)不仅可以提供类似*.so的库,还可以提供一些可执行文件(不仅用于测试)

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

我找到的关于构建适当目录结构的最佳链接是和。然而,作者建议创建嵌套目录结构,这在我的示例中似乎很难做到,因为如果我这样做,我将得到如下目录结构:

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

更新(解决方案):

答案很简单,我用cmake做了几天的实验并阅读了文档后发现了它

  • 图书馆。添加下面两行:

    export(PACKAGE <pkgName>)
    export(TARGETS <libTarget> FILE <pkgName>Config.cmake)
    
    所以,若并没有构建库,我们将看到错误消息,否则我们将能够使用target

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


    另外,如果你们知道更好的解决方案,我还在等待。

    我个人使用的是这样的

    ~/my_project
    ~/my_project/src
    ~/my_project/src/A
    ~/my_project/src/B
    ~/my_project/src/X
    ~/my_project/src/Y
    
    main
    CMakeLists.txt
    使用
    add_子目录
    添加
    src
    目录。
    src/CMakeLists.txt
    依次使用
    add_子目录
    添加
    A
    B
    X
    Y


    通过在
    CMakeLists.txt
    文件中正确设置依赖项,CMake将正确处理依赖项,并重建所需的一切(因此,如果您在
    X
    中进行更改,则
    Y
    a
    B
    应正确重建)。

    我个人使用的是这样的

    ~/my_project
    ~/my_project/src
    ~/my_project/src/A
    ~/my_project/src/B
    ~/my_project/src/X
    ~/my_project/src/Y
    
    main
    CMakeLists.txt
    使用
    add_子目录
    添加
    src
    目录。
    src/CMakeLists.txt
    依次使用
    add_子目录
    添加
    A
    B
    X
    Y


    通过在
    CMakeLists.txt
    文件中正确设置依赖项,CMake将正确处理依赖项,并重建所需的一切(因此,如果您在
    X
    中进行更改,则
    Y
    a
    B
    应正确重建).

    如果A和B绝对独立,我将它们放在不同的在线存储库中,其中~/my_project/CMakeLists.txt、~/my_project/src/CMakeLists.txt应该放在哪里?@BhavinChirag如果
    A
    B
    是真正独立的,那么我的方案将不起作用,因为它将
    A
    B
    视为包的一部分,或子项目。在这种情况下,我的建议是使
    X
    Y
    也独立,创建您自己的
    FindX.cmake
    FindY.cmake
    文件,并独立构建库,然后分别按照正确的顺序构建和安装每个库。如果A和B完全独立,我将它们推到不同的在线存储库中,其中~/my_project/CMakeLists.txt、~/my_project/src/CMakeLists.txt应该是独立的?@BhavinChirag如果
    A
    B
    是真正独立的,那么我的方案就不会起作用,它将
    A
    B
    视为包或子项目的一部分。在这种情况下,我的建议是使
    X
    Y
    也独立,创建您自己的
    FindX.cmake
    FindY.cmake
    文件,并独立构建库,然后分别以正确的顺序构建和安装每个库。