CMake target_link_libraries在MinGW Makefiles生成器下工作异常
MinGW环境下CMake链接库后缀错误的解决方法
问题背景
项目中的CMakeLists.txt配置如下:
set(NUMBERTEXT_MAJOR_VERSION 1) set(NUMBERTEXT_MINOR_VERSION 0) set(NUMBERTEXT_MICRO_VERSION 12) set(NUMBERTEXT_VERSION "${NUMBERTEXT_MAJOR_VERSION}.${NUMBERTEXT_MINOR_VERSION}.${NUMBERTEXT_MICRO_VERSION}") add_library( libnumbertext SHARED "${CMAKE_SOURCE_DIR}/src/Numbertext.cxx" "${CMAKE_SOURCE_DIR}/src/Numbertext.hxx" "${CMAKE_SOURCE_DIR}/src/NumberTextAPI.hxx" "${CMAKE_SOURCE_DIR}/src/Soros.cxx" "${CMAKE_SOURCE_DIR}/src/Soros.hxx") target_include_directories(libnumbertext PRIVATE "${CMAKE_SOURCE_DIR}/src" "${CMAKE_BINARY_DIR}/src") set_target_properties(libnumbertext PROPERTIES VERSION "${NUMBERTEXT_VERSION}" SOVERSION "${NUMBERTEXT_MAJOR_VERSION}" OUTPUT_NAME "libnumbertext-${NUMBERTEXT_VERSION}") add_executable(spellout "${CMAKE_SOURCE_DIR}/src/spellout.cxx") target_include_directories(spellout PRIVATE "${CMAKE_SOURCE_DIR}/src" "${CMAKE_BINARY_DIR}/src") target_link_libraries(spellout libnumbertext)
构建时出现错误:
mingw32-make[2]: *** No rule to make target 'libnumbertext-1.0.12.lib', needed by 'spellout.exe'. Stop. mingw32-make[2]: Leaving directory 'D:/git/BenKeyFSI/libnumbertext/build' mingw32-make[1]: *** [CMakeFiles\Makefile2:110: CMakeFiles/spellout.dir/all] Error 2
问题核心:MinGW环境下应该链接.a后缀的库文件,但CMake错误地寻找.lib后缀的目标。
解决方法
方法1:强制指定库文件后缀
在set_target_properties中添加SUFFIX属性,直接指定生成.a后缀的库:set_target_properties(libnumbertext PROPERTIES VERSION "${NUMBERTEXT_VERSION}" SOVERSION "${NUMBERTEXT_MAJOR_VERSION}" OUTPUT_NAME "libnumbertext-${NUMBERTEXT_VERSION}" SUFFIX ".a")方法2:调整CMake的库后缀查找顺序
在CMakeLists.txt开头添加环境判断,让MinGW优先识别.a后缀:if(MINGW) set(CMAKE_FIND_LIBRARY_SUFFIXES ".a" ".lib") endif()方法3:简化目标命名规则
不在OUTPUT_NAME中包含版本号,改用CMake默认命名逻辑,依赖VERSION和SOVERSION管理版本:set_target_properties(libnumbertext PROPERTIES VERSION "${NUMBERTEXT_VERSION}" SOVERSION "${NUMBERTEXT_MAJOR_VERSION}" OUTPUT_NAME "libnumbertext")此配置会生成
libnumbertext-1.0.12.a,且CMake能自动识别正确的链接目标。
说明
MinGW环境下CMake可能混合Windows与Unix的库后缀规则,通过上述任意一种方法,都可以强制指定正确的.a后缀,确保链接阶段找到对应的库文件。
内容的提问来源于stack exchange,提问作者Benilda Key
相关产品推荐
相关产品推荐

