使用CMake编译兼容Windows XP至Win10的应用时链接报错如何解决
报错解决及配置修正方案
根本错误原因
你使用了MSVC专属的/SUBSYSTEM:WINDOWS,5.1链接参数,MinGW的g++/ld链接器不识别这种斜杠开头的MSVC风格语法,会将其误认为是待链接的文件名,因此抛出"无此文件或目录"错误。此外你的CMake配置还存在目标定义顺序错误、链接库不兼容两个潜在问题。
具体修正步骤
- 1 替换子系统参数为MinGW支持的格式
MinGW需要通过-Wl,前缀将参数传递给链接器,子系统的正确写法为-Wl,--subsystem,windows,5.1,其中5.1对应32位Windows XP的子系统版本号,符合你的兼容要求。 - 2 调整CMake语句顺序
target_link_libraries必须在ADD_EXECUTABLE之后调用,因为前者依赖后者创建的编译目标。 - 3 替换MSVC专属的链接库
配置中的opengl32.lib是MSVC格式的库文件,MinGW下直接写opengl32即可,工具链会自动匹配对应的静态导入库。
修正后的完整核心配置代码
SET(toolchain_lib "E:/mingw32/lib" "E:/mingw32/lib/gcc/mingw32/5.3.0") LINK_DIRECTORIES(${toolchain_lib}) # 先定义编译目标 FILE (GLOB SRC_LIST "${src}/*.cpp" "${inc}/*.h") ADD_EXECUTABLE(${TARGET_NAME} ${SRC_LIST}) # 再配置目标链接库 target_link_libraries(${TARGET_NAME} libgdi32.a libglu32.a #freeglut.dll freeglut.a libglew32.a #libglew32.dll.a opengl32 libstdc++.a libgcc.a ) # 修正链接器参数 set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++ -Wl,--subsystem,windows,5.1")
额外验证建议
编译完成后可以使用dumpbin /headers 生成的exe路径命令查看PE头信息,确认子系统版本为5.1,即可保证Windows XP及以上系统兼容。
内容的提问来源于stack exchange,提问作者anti-gravity
相关产品推荐
相关产品推荐

