想象一个包含多个组件的整体项目:
- basic
- io
- web
- app-a
- app-b
- app-c
现在,假设 web 依赖于 io,而 io 又依赖于 basic,所有这些东西都在一个存储库中,并且有一个 CMakeLists.txt 将它们构建为共享库。
如果这三个应用程序都是可选的并且在构建时可能不存在,我应该如何设置才能构建这三个应用程序?
一个想法是在主存储库中有一个空的“apps”目录,我们可以将我们想要的任何应用程序存储库克隆到其中。我们的主 CMakeLists.txt 文件可以使用 GLOB 查找所有应用程序目录并构建它们(事先不知道会有多少个)。这种方法的问题包括:
- 显然,当你说时,CMake 不会重新全局化
make
,所以如果您添加新应用程序,您必须运行cmake
again.
- 它为构建人员强加了特定的结构。
- 目前尚不清楚如何对单个应用程序进行两个克隆,并针对同一个库构建分别构建它们。
一般概念就像传统的递归 CMake 项目,但较低级别的模块不一定提前知道哪些较高级别的模块将使用它们。然而,我不想要求用户将较低级别的库安装在固定位置(例如/usr/local/lib
)。但是我确实想要一次调用make
注意到整个项目中依赖关系的变化,这样如果我正在构建一个应用程序但更改了其中一个低级库,所有内容都会适当地重新编译。
我的第一个想法是使用 CMake导入/导出目标特征。
有一个 CMakeLists.txtbasic
, io
and web
和一个引用这些内容的 CMakeLists.txt。然后你可以使用 CMakeexport导出这些目标的功能,然后应用程序项目可以importCMake 目标。
当您首先构建库项目时,应用程序项目应该能够自动找到已编译的库(无需将库安装到/usr/local/lib
),否则始终可以设置正确的 CMake 变量来指示正确的目录。
当这样做时make
在应用程序项目中不会做make
在图书馆项目中,您必须自己处理这个问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)