为何CMake在Windows下不遵循LIBRARY_OUTPUT_DIRECTORY设置?
问题原因与解决方法
核心原因
Windows平台下,CMake对DLL文件和**导入库(.lib)**的输出路径是分开控制的:
LIBRARY_OUTPUT_DIRECTORY仅控制静态库、以及Unix-like系统(如macOS、Linux)的共享库(dylib/so)的输出路径;- Windows的DLL属于运行时组件,其输出路径由
RUNTIME_OUTPUT_DIRECTORY属性控制,你当前只设置了前者,所以DLL仍走默认路径。
解决方案
方法1:针对目标同时设置两个属性
修改CMakeLists.txt,同时指定DLL和导入库的输出目录:
cmake_minimum_required(VERSION 3.23) project(helloworld) add_library(hellolib SHARED "libmain.cpp") # 设置DLL(运行时库)输出路径 set_target_properties(hellolib PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin # 可选:同时设置导入库的输出路径,默认会和DLL同目录,也可单独指定 LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin )
方法2:按配置类型指定路径(推荐)
如果需要区分Debug/Release等配置,可使用带配置后缀的属性:
set_target_properties(hellolib PROPERTIES RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_SOURCE_DIR}/bin/Debug RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_SOURCE_DIR}/bin/Release LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CMAKE_SOURCE_DIR}/bin/Debug LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CMAKE_SOURCE_DIR}/bin/Release )
方法3:全局设置所有目标的输出路径
如果项目中有多个目标,可全局统一配置:
# 全局设置运行时库(DLL)输出路径 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin) # 全局设置库文件(静态库、导入库、Unix共享库)输出路径 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin) # 按配置全局设置(可选) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_SOURCE_DIR}/bin/Debug) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_SOURCE_DIR}/bin/Release)
验证效果
修改后重新执行构建步骤:
cd build cmake .. cmake --build .
此时DLL文件会生成到projectdir/bin(或对应配置的子目录)中,导入库也会同步到对应路径。
内容的提问来源于stack exchange,提问作者Vince W.
相关产品推荐
相关产品推荐

