首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否使用CMake自动将文件夹中的所有文件添加到目标?

是否使用CMake自动将文件夹中的所有文件添加到目标?
EN

Stack Overflow用户
提问于 2010-07-08 14:30:18
回答 5查看 185.9K关注 0票数 188

我正在考虑将一个跨平台的项目从Visual C++、XCode和CMake文件中的独立构建管理系统切换到CMake。

我需要的一个基本功能是自动将目录中的所有文件添加到目标。虽然使用make很容易做到这一点,但使用Visual C++和XCode却不容易做到(如果我错了,请纠正我)。有没有可能直接在CMake中做?多么?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-07-08 14:38:42

从CMake 3.1+开始,开发人员强烈建议用户不要使用file(GLOBfile(GLOB_RECURSE来收集源文件列表。

注意:我们不建议使用从源树中收集源文件列表。如果在添加或删除源代码时没有更改CMakeLists.txt文件,则生成的构建系统无法知道何时要求CMake重新生成。CONFIGURE_DEPENDS标志可能不能在所有生成器上可靠地工作,或者如果将来添加了不支持它的新生成器,使用它的项目将被卡住。即使CONFIGURE_DEPENDS能够可靠地工作,在每次重建时执行检查也是有成本的。

请参阅documentation here

这里有两个答案([1][2]),所以详细说明了手动列出源文件的原因。

这是可能的。例如,使用file(GLOB

代码语言:javascript
运行
复制
cmake_minimum_required(VERSION 2.8)

file(GLOB helloworld_SRC
     "*.h"
     "*.cpp"
)

add_executable(helloworld ${helloworld_SRC})

请注意,如果添加或删除了源文件,则需要手动重新运行cmake,因为生成的构建系统不知道何时要求CMake重新生成,并且在每次构建时都这样做会增加构建时间。

从CMake 3.12开始,您可以将CONFIGURE_DEPENDS标志传递给file(GLOB,以便在调用构建时自动检查并重置文件列表。你可以这样写:

代码语言:javascript
运行
复制
cmake_minimum_required(VERSION 3.12)

file(GLOB helloworld_SRC CONFIGURE_DEPENDS "*.h" "*.cpp")

这样至少可以避免每次添加文件时都手动重新运行CMake。

票数 261
EN

Stack Overflow用户

发布于 2012-08-16 23:32:26

Kleist的答案当然是有效的,但有一个重要的警告:

当您手动编写Makefile时,可以使用一个函数生成一个SRCS变量来选择所有.cpp.h文件。如果稍后添加了源文件,则重新运行make将包含该源文件。

但是,CMake (使用类似file(GLOB ...)的命令)将显式地生成一个文件列表,并将其放入自动生成的Makefile中。如果您有一个新的源文件,则需要通过重新运行cmake来重新生成Makefile

编辑:不需要删除Makefile。

票数 34
EN

Stack Overflow用户

发布于 2020-01-29 06:19:01

适用于@Kleist answer扩展

由于CMake 3.12附加选项CONFIGURE_DEPENDS是通过命令file(GLOB)file(GLOB_RECURSE)执行supported的。有了这个选项,没有需要手动在添加/删除目录中的源文件后重新运行CMake - CMake将在下一次构建项目时自动重新运行。

然而,选项CONFIGURE_DEPENDS意味着每次请求构建时都会重新检查相应的目录,因此build进程将比没有CONFIGURE_DEPENDS时消耗更多的时间。

即使有CONFIGURE_DEPENDS选项可用,CMake文档仍然建议不要使用使用file(GLOB)file(GLOB_RECURSE)来收集源代码。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3201154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档