我有一个很大的代码库,它构建了几十个库和几个可执行文件。
代码库按层次结构进行分解,并且几乎在每个级别都构建了库。
我已经仔细检查并在每个目录中放置了一个 CMakeLists.txt 文件来构建每个库。
在每个 CMakeLists.txt 中,我都使用了“project( xxx )”指令。这为我定义了 PROJECT_NAME、PROJECT_SOURCE_DIR 和 PROJECT_BINARY_DIR 变量,我明智地使用了这些变量。
然而,团队中的一个人对这种方法并不满意,因为他找不到任何其他人这样做的现实例子。他经常引用 KitWare 的例子来说明没有使用这种方法,因此我们也不应该这样做。
他提倡的另一种方法是在每个 makefile 中设置这些变量,这看起来很像“项目”为您提供的内容。
我真的不明白他的观点,并且在说服他否则方面没有取得什么进展。任何人都可以阐明以这种方式使用项目指令的缺点吗?
我全心全意依靠你们的集体智慧?
首先,它使您能够使用<projectName>_BINARY_DIR
and <projectName>_SOURCE_DIR
,但这不是主要优势。如果您给 CMake 一个项目名称,那么它将为每个子项目在其自己的目录中生成构建目标。这意味着无论您使用 GNU Make、Eclipse CDT、XCode 还是任何其他受支持的生成器,您都可以单独构建子项目。例如,使用 GNU Make,每个子项目都有来自其自己目录的完整构建系统。
您可以通过以下方式访问当前项目名称PROJECT_NAME
,以及根项目名称CMAKE_PROJECT_NAME
.
编辑:我刚刚意识到以下内容将是其任何构建目标的标准 CMake 行为,无论它们是否是项目。我将其保留在这里作为一般信息,但它与答案无关:
假设我有一个 C++ 库,并且我可以生成三个二进制可执行文件;Main
and tests/test1
, and examples/ex1
。我可以在我调用 CMake 的目录中使用 ALL 目标运行 make,运行make ex1
,或者我可以将目录更改为examples/
并构建示例make
从该目录。这将构建所有依赖的项目和库,即使它们位于目录结构中的其他位置,但不会构建Main
or tests/test1
或它们依赖的任何库examples/ex1
没有。如果我然后从主目录运行 make,它不会重建任何库examples/ex1
取决于除非它们的来源发生了变化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)