Windows 下 CMake 输出目录必须按类型分别设置,不能只靠 EXECUTABLE_OUTPUT_PATH 一个变量搞定;CMAKE_RUNTIME_OUTPUT_DIRECTORY 是最常用、最可靠的选择。因为 EXECUTABLE_OUTPUT_PATH 自 CMake 3.0 起已被弃用,仅对旧版兼容且在 Windows 上受生成器(如 Visual Studio)限制而基本失效,官方推荐使用按目标类型区分的 CMAKE_RUNTIME_OUTPUT_DIRECTORY、CMAKE_LIBRARY_OUTPUT_DIRECTORY 和 CMAKE_ARCHIVE_OUTPUT_DIRECTORY。

直接结论:Windows 下 CMake 输出目录必须按类型分别设置,不能只靠 EXECUTABLE_OUTPUT_PATH 一个变量搞定;CMAKE_RUNTIME_OUTPUT_DIRECTORY 是最常用、最可靠的选择。
为什么 EXECUTABLE_OUTPUT_PATH 在 Windows 上基本失效?
这个变量在旧版 CMake(build/Debug/ 或 build/Release/ 下。
-
EXECUTABLE_OUTPUT_PATH只对 Makefile Generator 有弱作用,且不区分构建类型 - VS 和 Ninja 构建器完全忽略该变量,只认
CMAKE_RUNTIME_OUTPUT_DIRECTORY及其变体 - 若同时设了
EXECUTABLE_OUTPUT_PATH和CMAKE_RUNTIME_OUTPUT_DIRECTORY,后者生效
CMAKE_RUNTIME_OUTPUT_DIRECTORY 怎么设才真正跨配置生效?
它控制可执行文件(.exe)、动态库(.dll)及其配套 pdb 的输出位置。关键在于:**必须在调用 add_executable() 之前设置,且推荐用绝对路径避免相对路径歧义**。
- 正确写法:
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") - 若要区分 Debug/Release,需配合
set_target_properties():set_target_properties(your_target PROPERTIES RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}/bin/Debug" RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_BINARY_DIR}/bin/Release") - 注意:
RUNTIME_OUTPUT_DIRECTORY_DEBUG等属性只在多配置生成器(如 Visual Studio)下有效;单配置生成器(如 Ninja)仍只看CMAKE_RUNTIME_OUTPUT_DIRECTORY
静态库和动态库的输出路径怎么分开管?
Windows 下 .lib 文件(无论是静态库归档还是动态库导入库)走 CMAKE_ARCHIVE_OUTPUT_DIRECTORY;.dll 本身走 CMAKE_RUNTIME_OUTPUT_DIRECTORY。别混用。
- 静态库(
add_library(foo STATIC)):输出.lib到CMAKE_ARCHIVE_OUTPUT_DIRECTORY - 动态库(
add_library(foo SHARED)):输出.dll到CMAKE_RUNTIME_OUTPUT_DIRECTORY,对应.lib(导入库)到CMAKE_ARCHIVE_OUTPUT_DIRECTORY - 示例:
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
常见坑:路径里带空格或中文导致构建失败
Windows 下 CMake 对路径敏感,尤其当 CMAKE_BINARY_DIR 或你手动拼接的路径含空格(如 C:/Users/John Doe/project/build)或中文时,MSVC 链接器常报 LNK1104: cannot open file 或找不到 .lib。
- 解决方案:始终用
${CMAKE_BINARY_DIR}替代手写路径,它天然规避用户桌面路径中的空格 - 绝对避免在项目路径、构建路径中使用中文字符——CMake 解析会出错,不是警告,是直接中断
- 调试技巧:加一句
message(STATUS "BIN DIR = ${CMAKE_BINARY_DIR}"),确认路径实际值
真正麻烦的不是设路径,而是不同生成器对同一变量的响应差异;Windows 下优先信 CMAKE_RUNTIME_OUTPUT_DIRECTORY 和 CMAKE_ARCHIVE_OUTPUT_DIRECTORY,其他变量要么过时,要么只在特定条件下起效。


















