如何在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的递归调用:
- 在根目录
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)
- 确保每个子模块的
CMakeLists.txt都明确声明了自己的目标(比如add_executable或add_library)。
这种方式会让Make在同一个进程中完成所有目标的构建,而非递归调用子目录的make,自然就不会产生目录切换的提示。不过需要你清楚每个子模块的具体目标名称,适合对项目结构有清晰掌控的场景。
方案3:排查子模块局部配置
虽然你已经全局设置了CMAKE_VERBOSE_MAKEFILE OFF,但还是要确认是否有子模块的CMakeLists.txt单独开启了VERBOSE_MAKEFILE ON。如果存在这类局部配置,将其删除,保持全局配置统一即可。
验证效果
完成配置后,建议先删除原有的build目录,重新执行cmake ..生成构建文件,再运行make或cmake --build .,就能看到那些冗余的目录提示已经消失了。
内容的提问来源于stack exchange,提问作者MrYannKee




