executable_output_path 已废弃,现代 cmake 应使用 set_target_properties(... runtime_output_directory ...) 或 set(cmake_runtime_output_directory ...) 控制可执行文件输出路径。

EXECUTABLE_OUTPUT_PATH 在现代 CMake 中已经失效
直接说结论:EXECUTABLE_OUTPUT_PATH 是 CMake 2.x 时代的遗留变量,从 CMake 3.0 开始被标记为 deprecated,3.15+ 版本中彻底不推荐使用,且在 add_executable() 后设置它完全无效。你改了这个变量,生成的可执行文件照样落在默认位置(比如 build/ 下),不会移动。
正确做法:用 set_target_properties() 控制单个目标输出路径
现代 CMake 要求按目标(target)粒度配置输出路径,而不是全局一刀切。核心是给每个可执行目标显式设置 RUNTIME_OUTPUT_DIRECTORY 属性:
add_executable(myapp main.cpp)
set_target_properties(myapp PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
)
这样 myapp 编译后就会输出到 build/bin/myapp(Linux/macOS)或 build/bin/myapp.exe(Windows)。
- 必须在
add_executable()之后调用set_target_properties(),顺序反了会报错“Target myapp not found” -
RUNTIME_OUTPUT_DIRECTORY只影响可执行文件(.exe、无后缀二进制),不影响 DLL 或共享库(那要用LIBRARY_OUTPUT_DIRECTORY) - 路径值建议用
${CMAKE_BINARY_DIR}而不是硬编码./bin,否则多配置构建(如 Debug/Release)会冲突
批量设置所有可执行目标:用 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ...)
如果你真想“全局”生效(比如整个项目所有 add_executable() 都走统一 bin 目录),可以提前设置 CMake 的内置缓存变量:
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" CACHE PATH "Output directory for runtime binaries")
add_executable(app1 a.cpp)
add_executable(app2 b.cpp)
这个变量会在每个 add_executable() 内部自动映射为对应目标的 RUNTIME_OUTPUT_DIRECTORY 属性。
- 必须在第一个
add_executable()之前设置,否则对已创建的目标无效 - 它只影响后续新定义的可执行目标,不会 retroactively 修改已声明的目标
- 仍可对个别目标再用
set_target_properties()覆盖该值,优先级更高
为什么不能只靠 CMAKE_BINARY_DIR 或修改 OUTPUT_NAME
常见误区是以为改 CMAKE_BINARY_DIR 就能控制输出位置——其实它只是构建目录根路径,真正决定文件落点的是各 target 的 output directory 属性。而 OUTPUT_NAME 只改文件名(比如把 myapp 改成 myapp_debug),不改变所在目录。
-
set(CMAKE_BINARY_DIR "...")是非法操作,CMake 会报错 -
set_property(TARGET myapp PROPERTY OUTPUT_NAME "xxx")不影响路径,只影响文件名 - Windows 下注意:DLL 的搜索路径和可执行文件不在同一目录时,运行会报 “找不到 xxx.dll”,这时还得配
RUNTIME_OUTPUT_DIRECTORY统一或用install()规则
set_target_properties() 或放错位置,就等于没配。C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











