我想知道为使用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
,{{ 1}}。每个项目都有自己的测试,并将被推送到单独的代码库中。
我发现有关构建正确目录结构的最佳链接是this和this。但是作者建议创建嵌套的目录结构,这在我的例子中似乎很难做到,因为如果我这样做,我将最终得到这样的目录结构:
~/code/Y
我可以通过使用符号链接获得。但是在我的单独目录中,为每个项目编译了二进制文件(A/X
A/Y/X
B/Y/X
,A/build
,B/build
,X/build
)我会从不同的库中获得库和可执行文件的副本。如果我为所有版本调用Y/build
,那么由于二进制文件和库的重复,这些副本会造成混乱。
更新(解决方案):
答案恰好相当简单,经过几天的cmake和阅读文档试验后我发现了它。
Libray 即可。接下来两行:
make install
第一行将在export(PACKAGE <pkgName>)
export(TARGETS <libTarget> FILE <pkgName>Config.cmake)
中创建条目,该条目将告知库的构建目录所在的位置。其他项目中的Cmake调用从该路径开始搜索。
第二行将在构建目录中创建~/.cmake/packages/
。
可执行即可。添加下一行:
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})
。
当然,如果在库源中进行了一些更改,构建可执行文件不会触发重建库。为了解决这个问题,我编写了bash脚本,首先在库中调用<libTarget>
,然后在可执行构建目录中调用。{/ p>
P上。 S.如果你知道更好的解决方案,我还在等待它。
答案 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
添加A
,B
,X
和Y
。
通过CMakeLists.txt
文件中正确设置的依赖关系,CMake将正确处理依赖关系,并重建所需的一切(因此,如果您在X
然后Y
进行更改,{{1应该正确重建和A
。)