如何让CMake将.lib及.exe文件放入指定build文件夹?
问题根源与解决方案
你遇到的问题是Visual Studio作为多配置CMake生成器的特性导致的——普通的CMAKE_RUNTIME_OUTPUT_DIRECTORY这类变量仅对单配置生成器(如Makefile)生效,VS这类多配置生成器会优先使用带_<CONFIG>后缀的变量,或通过生成器表达式来指定输出路径。
正确的配置方式
1. 全局统一设置(顶层CMakeLists.txt)
在顶层CMake中使用生成器表达式或多配置专用变量,确保所有目标的产物按项目分组放入build目录:
# 按项目分组,将产物放入 build/<项目名>/[bin/lib],可根据需求添加$<CONFIG>区分Release/Debug set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/$<PROJECT_NAME>/bin) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/$<PROJECT_NAME>/lib) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/$<PROJECT_NAME>/lib) # 如果需要区分Release/Debug配置,可改为: # set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/$<CONFIG>/$<PROJECT_NAME>/bin) # set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/$<CONFIG>/$<PROJECT_NAME>/lib) # set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/$<CONFIG>/$<PROJECT_NAME>/lib) # 继续你的子目录添加 add_subdirectory(actualLib ${CMAKE_BINARY_DIR}/actualLib) add_subdirectory(examples ${CMAKE_BINARY_DIR}/examples) add_subdirectory(unittests ${CMAKE_BINARY_DIR}/unittests)
2. 目标级单独设置(子项目CMakeLists.txt)
如果需要为特定目标自定义路径(比如actualLib),需针对配置后缀设置属性:
# 在actualLib/CMakeLists.txt中 add_library(${PROJECT_NAME} STATIC ${SOURCE_FILES}) set_target_properties(${PROJECT_NAME} PROPERTIES # Release配置的静态库输出到build/actualLib/lib ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/actualLib/lib # 若需要Debug配置也统一路径,添加该行 ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/actualLib/lib )
同理,examples项目可设置:
# 在examples/CMakeLists.txt中 add_executable(${PROJECT_NAME} main.cpp) target_link_libraries(${PROJECT_NAME} actualLib) set_target_properties(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/examples/bin RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/examples/bin )
验证与注意事项
- 修改配置后,需要删除原build和x64目录,重新执行CMake生成和构建命令,避免缓存干扰:
rmdir /s /q build x64 cmake -S "C:\actualLib\actualLib" -B "build" -G "Visual Studio 16 2019" -A "x64" cmake --build "build" --config Release - 子项目的二进制目录(
add_subdirectory的第二个参数)是CMake存放中间文件的地方,和最终产物的输出目录是两个概念,你的原有设置是合理的。
内容的提问来源于stack exchange,提问作者EarlWalker
相关产品推荐
相关产品推荐

