You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在CMake项目中抑制"Entering directory"目录切换提示信息?

解决CMake多子模块项目构建时的目录冗余输出问题

你遇到的这些make[2]: Entering directory...make[2]: Leaving directory...信息,是GNU Make在递归构建子目录时的默认输出。既然你不想手动加--no-print-directory参数,下面几个CMake配置方案可以帮你全局解决这个问题:

方案1:全局设置Make默认参数

在根目录的CMakeLists.txt中添加以下配置(建议放在文件开头,project()命令前后都可):

# 让CMake生成的Makefile自动传递--no-print-directory参数给底层make
set(CMAKE_MAKE_FLAGS "--no-print-directory")

这样执行cmake --build .或直接make时,CMake会自动把参数传递给make,递归构建子模块时就不会再输出那些冗余的目录切换提示了,完全不需要你手动额外加参数。

方案2:手动控制目标依赖(进阶)

如果方案1不符合你的需求,你可以通过统一管理目标依赖,避免Make的递归调用:

  1. 在根目录CMakeLists.txt中定义全局构建目标,并关联子模块的具体目标:
# 创建一个全局总目标
add_custom_target(ALL_PROJECT_TARGETS ALL)

# 假设子模块目录为submod_a、submod_b
add_subdirectory(submod_a)
# 替换为submod_a中实际的可执行/库目标名
add_dependencies(ALL_PROJECT_TARGETS submod_a_exec)

add_subdirectory(submod_b)
# 替换为submod_b中实际的可执行/库目标名
add_dependencies(ALL_PROJECT_TARGETS submod_b_lib)
  1. 确保每个子模块的CMakeLists.txt都明确声明了自己的目标(比如add_executableadd_library)。

这种方式会让Make在同一个进程中完成所有目标的构建,而非递归调用子目录的make,自然就不会产生目录切换的提示。不过需要你清楚每个子模块的具体目标名称,适合对项目结构有清晰掌控的场景。

方案3:排查子模块局部配置

虽然你已经全局设置了CMAKE_VERBOSE_MAKEFILE OFF,但还是要确认是否有子模块的CMakeLists.txt单独开启了VERBOSE_MAKEFILE ON。如果存在这类局部配置,将其删除,保持全局配置统一即可。

验证效果

完成配置后,建议先删除原有的build目录,重新执行cmake ..生成构建文件,再运行makecmake --build .,就能看到那些冗余的目录提示已经消失了。

内容的提问来源于stack exchange,提问作者MrYannKee

火山引擎 最新活动