【发布时间】:2017-05-24 07:13:25
【问题描述】:
我想知道为使用 cmake 构建的多个依赖 c++ 项目制作目录结构的最佳方法是什么,以及在这种情况下 cmake 脚本应该是什么样子。 (如果重要的话,我会在 linux 中使用 gcc 进行。)
我有多个独立项目A、B。我还有多个库X、Y。
当这些库由其他开发人员制作时没有问题。我可以使用现有的FindX.cmake 或自己编写来跟踪它们。
当X、Y 是我自己的库时,就会出现问题。让A 依赖于X 和Y,项目B 依赖于Y。此外,让Y 依赖于X(因为我重用了一些常见的,与任务无关的代码)。但是,我认为可以有更多的库、项目和更大的嵌套深度。第二个假设是库(例如X)不仅可以提供*.so之类的库,还可以提供一些可执行文件(不仅用于测试)。
当我重建我的项目时,我想重建所有依赖项,因为我可以同时在项目和库中进行修改。此外,我想将库彼此分开,并为我的所有项目创建一个目录code,其中将包含4个子目录:~/code/A、~/code/B、~/code/X、~/code/Y。每个项目都有自己的测试,并将被推送到单独的代码存储库中。
我发现关于构建正确目录结构的最佳链接是this 和this。但是作者建议创建嵌套目录结构,这在我的示例中似乎很难做到,因为如果我这样做,我最终会得到这样的目录结构:
A/X
A/Y/X
B/Y/X
我可以通过使用符号链接获得。但是然后在我的单独目录中为每个项目编译二进制文件(A/build、B/build、X/build、Y/build)我将拥有来自不同库的库和可执行文件的副本。如果我为所有构建调用make install,这些副本将由于二进制文件和库的重复而造成混乱。
更新(解决方案):
答案很简单,经过几天的 cmake 试验和阅读文档,我找到了答案。
-
图书馆。添加接下来的两行:
export(PACKAGE <pkgName>) export(TARGETS <libTarget> FILE <pkgName>Config.cmake)第一行将在
~/.cmake/packages/中创建条目,这将告诉库的构建目录位于何处。其他项目中的 Cmake 调用从该路径开始搜索。第二行将在构建目录中创建
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})因此,如果没有构建库,我们将看到错误消息,否则我们将能够使用目标
<libTarget>。
当然,如果对库源进行了一些更改,构建可执行文件不会触发重新构建库。为了克服这个问题,我编写了 bash 脚本,首先在库中调用 make,然后在可执行构建目录中调用。
P。 S.如果你知道更好的解决方案,我还在等待。
【问题讨论】: