CMake指定静态库输出目录无效及lib前缀自动添加问题求助
问题描述
我正在创建静态库,功能运行正常,但存在两个问题:
- 已指定库文件生成目录为
${CMAKE_CURRENT_SOURCE_DIR}/Build/MSVC/bin,实际却生成在build文件夹中 - 文件名自动添加了
lib前缀,而我不需要这个前缀
我的CMakeLists.txt代码如下:
cmake_minimum_required(VERSION 3.26) add_definitions(-DUNICODE -D_UNICODE) project(AxoSerial-MSVC) set(CMAKE_CXX_STANDARD 17) add_library(AxoSerial-MSVC STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/AxoSerial.cpp) target_include_directories(AxoSerial-MSVC PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) set_target_properties(AxoSerial-MSVC PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/Build/MSVC/bin" CMAKE_CXX_COMPILER "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.29.30133/bin/HostX64/x64/cl.exe" SUFFIX ".lib" ) project(AxoSerial-MinGW) set(CMAKE_CXX_STANDARD 17) add_library(AxoSerial-MinGW STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/AxoSerial.cpp main.cpp) target_include_directories(AxoSerial-MinGW PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) set_target_properties(AxoSerial-MinGW PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/Build/MSVC/bin" CMAKE_CXX_COMPILER g++ SUFFIX ".lib" ) project(main) set(CMAKE_CXX_STANDARD 17) add_executable(main main.cpp) target_link_libraries(main PRIVATE AxoSerial-MSVC) target_include_directories(main PUBLIC ${CMAKE_SOURCE_DIR}/include)
目录结构:
C:. │ CMakeLists.txt │ main.cpp │ ├───.idea │ .gitignore │ .name │ AxoSerial.iml │ misc.xml │ modules.xml │ workspace.xml │ ├───Build │ │ .ninja_deps │ │ .ninja_log │ │ build.ninja │ │ CMakeCache.txt │ │ cmake_install.cmake │ │ libAxoSerial-MinGW.lib │ │ libAxoSerial-MSVC.lib │ │ main.exe │ │ │ ├───.cmake │ │ └───api │ │ └───v1 │ │ ├───query │ │ │ cache-v2 │ │ │ cmakeFiles-v1 │ │ │ codemodel-v2 │ │ │ toolchains-v1 │ │ │ │ │ └───reply │ │ cache-v2-41e28885b8099980ddf6.json │ │ cmakeFiles-v1-4dd9e73c28e719aace8b.json │ │ codemodel-v2-c699778468e6a4bb9941.json │ │ directory-.-Debug-d0094a50bb2071803777.json │ │ index-2023-11-09T02-34-15-0214.json │ │ target-AxoSerial-MinGW-Debug-a763cdb921b125cef898.json │ │ target-AxoSerial-MSVC-Debug-bb5afb7fe9924aefe8ab.json │ │ target-main-Debug-503dda660556d3767039.json │ │ toolchains-v1-af93b67b788c93364498.json │ │ │ ├───CMakeFiles │ │ │ clion-Debug-log.txt │ │ │ clion-environment.txt │ │ │ cmake.check_cache │ │ │ CMakeConfigureLog.yaml │ │ │ rules.ninja │ │ │ TargetDirectories.txt │ │ │ │ │ ├───3.26.4 │ │ │ │ CMakeCCompiler.cmake │ │ │ │ CMakeCXXCompiler.cmake │ │ │ │ CMakeDetermineCompilerABI_C.bin │ │ │ │ CMakeDetermineCompilerABI_CXX.bin │ │ │ │ CMakeRCCompiler.cmake │ │ │ │ CMakeSystem.cmake │ │ │ │ │ │ │ ├───CompilerIdC │ │ │ │ │ a.exe │ │ │ │ │ CMakeCCompilerId.c │ │ │ │ │ │ │ │ │ └───tmp │ │ │ └───CompilerIdCXX │ │ │ │ a.exe │ │ │ │ CMakeCXXCompilerId.cpp │ │ │ │ │ │ │ └───tmp │ │ ├───AxoSerial-MinGW.dir │ │ │ │ main.cpp.obj │ │ │ │ │ │ │ └───src │ │ │ AxoSerial.cpp.obj │ │ │ │ │ ├───AxoSerial-MSVC.dir │ │ │ └───src │ │ │ AxoSerial.cpp.obj │ │ │ │ │ ├───main.dir │ │ │ main.cpp.obj │ │ │ │ │ └───pkgRedirects │ ├───MinGW │ │ └───bin │ ├───MSVC │ │ └───bin │ └───Testing │ └───Temporary │ LastTest.log │ ├───include │ AxoSerial.h │ └───src AxoSerial.cpp
我尝试设置了RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/Build/MSVC/bin",但问题仍未解决。
解决方案
1. 生成目录问题:使用正确的属性指定静态库路径
RUNTIME_OUTPUT_DIRECTORY仅适用于可执行文件和动态库,静态库需要用ARCHIVE_OUTPUT_DIRECTORY指定生成目录。如果需要区分Debug/Release版本,可以追加_{CONFIG}后缀单独设置。
2. 文件名前缀问题:清空默认前缀
MinGW编译器默认会给静态库添加lib前缀,通过设置PREFIX为空字符串可以移除该前缀;MSVC默认无此前缀,统一设置可保证跨编译器一致性。
3. 其他问题:修正错误的编译器配置和多project调用
CMAKE_CXX_COMPILER是全局变量,不能通过set_target_properties绑定到单个目标;多个project调用会重置全局配置,建议用单个主project管理所有目标。
修改后的CMakeLists.txt:
cmake_minimum_required(VERSION 3.26) add_definitions(-DUNICODE -D_UNICODE) project(AxoSerial) set(CMAKE_CXX_STANDARD 17) # MSVC静态库目标 add_library(AxoSerial-MSVC STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/AxoSerial.cpp) target_include_directories(AxoSerial-MSVC PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) set_target_properties(AxoSerial-MSVC PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/Build/MSVC/bin" # 可选:针对不同配置单独设置路径 ARCHIVE_OUTPUT_DIRECTORY_DEBUG "${CMAKE_CURRENT_SOURCE_DIR}/Build/MSVC/bin/Debug" ARCHIVE_OUTPUT_DIRECTORY_RELEASE "${CMAKE_CURRENT_SOURCE_DIR}/Build/MSVC/bin/Release" PREFIX "" SUFFIX ".lib" ) # MinGW静态库目标 add_library(AxoSerial-MinGW STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/AxoSerial.cpp main.cpp) target_include_directories(AxoSerial-MinGW PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) set_target_properties(AxoSerial-MinGW PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/Build/MinGW/bin" ARCHIVE_OUTPUT_DIRECTORY_DEBUG "${CMAKE_CURRENT_SOURCE_DIR}/Build/MinGW/bin/Debug" ARCHIVE_OUTPUT_DIRECTORY_RELEASE "${CMAKE_CURRENT_SOURCE_DIR}/Build/MinGW/bin/Release" PREFIX "" SUFFIX ".lib" ) # 可执行文件目标 add_executable(main main.cpp) target_link_libraries(main PRIVATE AxoSerial-MSVC) target_include_directories(main PUBLIC ${CMAKE_SOURCE_DIR}/include)
额外说明
- 如果需要同时用MSVC和MinGW编译,建议使用工具链文件分别配置,避免同一CMake环境下的编译器冲突。
- 修改后请删除原Build目录,重新执行
cmake ..和编译命令,确保旧缓存被清空。
内容的提问来源于stack exchange,提问作者Nico Cano
相关产品推荐
相关产品推荐

