CMake+C++编译32位Windows程序失败,提示不支持16位应用
解决跨平台编译Windows程序时的"不支持16位应用"错误
问题原因
你遇到的错误是因为在Linux下编译Windows程序时,未使用正确的MinGW交叉编译工具链,仅通过-m32强制32位编译会生成无效的可执行文件格式(ELF而非Windows PE格式),导致64位Windows系统误判为16位应用。同时你的CMake配置存在几个关键问题:
- 硬编码
gcc/g++编译器,未针对Windows目标使用交叉编译工具链 CMAKE_CXX_FLAGS中的-DCMAKE_BUILD_TYPE=release64是无效写法,CMAKE_BUILD_TYPE是CMake变量而非编译宏,且与-m32、Release设置冲突- 未根据平台区分可执行文件目标名,同时生成
a.exe和a.run会造成冗余
修正后的CMake配置
以下是适配跨平台编译的CMakeLists.txt,支持Linux本地编译和Linux交叉编译Windows程序:
cmake_minimum_required(VERSION 3.10) project(qpsm) # 设置全局编译模式 set(CMAKE_BUILD_TYPE Release) # 统一C++标准 set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 根据目标平台配置编译参数和目标文件名 if(CMAKE_SYSTEM_NAME STREQUAL "Windows") # Windows目标:使用MinGW交叉编译工具链 set(TARGET_EXECUTABLE "a.exe") # 可选:强制编译32位Windows程序(需对应32位工具链) # set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32") elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux") # Linux目标:使用本地gcc/g++ set(TARGET_EXECUTABLE "a.run") # 可选:强制编译32位Linux程序 # set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32") endif() add_executable(${TARGET_EXECUTABLE} main.cpp)
编译步骤(Linux下交叉编译Windows程序)
安装MinGW交叉编译工具链
- 编译32位Windows程序:
sudo apt install gcc-mingw-w64-i686 g++-mingw-w64-i686 - 编译64位Windows程序:
sudo apt install gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64
- 编译32位Windows程序:
执行CMake配置
- 生成32位Windows程序构建文件:
mkdir build && cd build cmake .. -DCMAKE_SYSTEM_NAME=Windows -DCMAKE_C_COMPILER=i686-w64-mingw32-gcc -DCMAKE_CXX_COMPILER=i686-w64-mingw32-g++ - 生成64位Windows程序构建文件:
mkdir build && cd build cmake .. -DCMAKE_SYSTEM_NAME=Windows -DCMAKE_C_COMPILER=x86_64-w64-mingw32-gcc -DCMAKE_CXX_COMPILER=x86_64-w64-mingw32-g++
- 生成32位Windows程序构建文件:
编译生成可执行文件
make
关键说明
- 必须使用MinGW交叉编译工具链生成Windows PE格式的可执行文件,直接用Linux的
gcc加-m32无法生成正确的Windows程序 - 如果需要在Windows本地编译,确保安装了MinGW-w64工具链,直接运行CMake即可自动识别平台
内容的提问来源于stack exchange,提问作者Kroyz
相关产品推荐
相关产品推荐

