You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CMake指定静态库输出目录无效及lib前缀自动添加问题求助

问题描述

我正在创建静态库,功能运行正常,但存在两个问题:

  1. 已指定库文件生成目录为${CMAKE_CURRENT_SOURCE_DIR}/Build/MSVC/bin,实际却生成在build文件夹中
  2. 文件名自动添加了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 16:59:53