(转)cmake构建时指定编译器架构(x86 or x64)

本文详细介绍如何通过CMake配置工具,在Windows、Linux及MacOSX环境下生成不同架构(32位与64位)的编译项目。涵盖Visual Studio、nmake、CMake变量等多种配置方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Windows

vs2015 x64编译器为例,cmake命令如下:

Xml代码   收藏代码
  1. cmake -G "Visual Studio 14 Win64" path\to\source\dir  

去掉Win64,就是32bit:

Xml代码   收藏代码
  1. cmake -G "Visual Studio 14" path\to\source\dir  

 

另外一种等价方式,用命令行参数-A来指定架构(x64或者ARM):

Xml代码   收藏代码
  1. cmake -A x64 path\to\source\dir  

更多参考:

https://cmake.org/cmake/help/v3.1/manual/cmake-generators.7.html#ide-build-tool-generators

 

windows下如果用了cmake -G"Visual Studio 14"命令,则cmake会给你生成Visual Studio工程文件相关的文件,比如:Project.sln,这时要编译生成必须用msbuild命令,比如:

Xml代码   收藏代码
  1. msbuild Project.sln  

完整步骤是:

Xml代码   收藏代码
  1. cmake -G "Visual Studio 14 Win64" path\to\source\dir  
  2. msbuild Project.sln  

 

windows nmake

windows还提供了一种构建命令:nmake。使用命令如下:

Xml代码   收藏代码
  1. cmake -G "NMake Makefiles" path\to\source\dir  
  2. nmake  

如果要为nmake指定x64/x86,还不清楚cmake有没相关参数设置,目前我知道的方法如下,

以vs2015为例,打开cmd,定位到Microsoft Visual Studio 14.0\VC\目录下,然后执行命令:

Xml代码   收藏代码
  1. vcvarsall.bat x64  

如果要32位,就执行:vcvarsall.bat x86。

执行完后再跳转到要构建的工程目录下,接着执行:cmake -G"NMake Makefiles" path\to\source\dir,以及:nmake。这样生成出来的程序就是x86或者x64版本。

 

 

Linux

设置CFLAGS(或者CXXFLAGS)为-m32或者-m64,例如:

Xml代码   收藏代码
  1. export CFLAGS=-m32  

 

 

Mac OSX

32 bit

Xml代码   收藏代码
  1. cmake -DCMAKE_OSX_ARCHITECTURES=i386 /path/to/source/dir  

 

64 bit

Xml代码   收藏代码
  1. cmake -DCMAKE_OSX_ARCHITECTURES=x86_64 /path/to/source/dir will compile  

 

96-bit universal

Xml代码   收藏代码
  1. cmake "-DCMAKE_OSX_ARCHITECTURES=x86_64;i386" /path/to/source/dir  

 

参考:

http://stackoverflow.com/questions/5334095/cmake-multiarchitecture-compilation

<think>我们正在处理两个主要问题:1.CMake弃用警告:CompatibilitywithCMake<2.8.12willberemoved...建议更新VERSION参数。2.使用MinGWMakefiles生成器出现错误:GeneratorMinGWMakefilesdoesnotsupportplatformspecificationx64。根据引用[1]中的错误信息,用户遇到了两个问题:-弃用警告:建议更新cmake_minimum_required的VERSION参数。-项目配置错误:因为找不到nmake,并且C/C++编译器未设置。另外,引用[3]提到在安装OpenCV-Python遇到MinGWMakefiles生成器失败,并给出了解决方案:使用.whl文件代替源代码安装。但是用户现在的问题是在使用CMake构建自己的项目出现的,不是安装OpenCV-Python。因此,我们主要关注如何解决用户CMake项目中的问题。问题分析:1.弃用警告:这是因为在CMakeLists.txt中使用了较旧的cmake_minimum_required语法。在较新版本的CMake中,建议使用范围版本或至少指定一个较高的最低版本。2.生成器错误:用户尝试使用MinGWMakefiles生成器,并指定了平台x64,但该生成器不支持平台规范。解决方案:对于弃用警告:-修改CMakeLists.txt,将`cmake_minimum_required`的版本更新到至少2.8.12以上,或者按照警告建议使用范围版本(如`VERSION3.10...3.25`)。例如:cmake_minimum_required(VERSION3.10)对于生成器错误:-错误信息显示:`GeneratorMinGWMakefilesdoesnotsupportplatformspecificationx64`。这意味着在使用MinGW生成器不能指定平台为x64。-有两种方法解决:方法1:不使用平台规范,即去掉`-Ax64`参数(如果使用命令行指定了平台)。方法2:使用支持平台规范的生成器,例如VisualStudio生成器。但是,引用[1]中用户使用的是命令:`cmake.`,并没有显式指定生成器,但是CMake自动选择了“NMakeMakefiles”,这导致了另一个错误(因为找不到nmake)。因此,用户可能是在Windows上,并且希望使用MinGW(gcc)进行编译。正确的步骤应该是:1.确保MinGW已经安装并正确配置(将MinGW的bin目录添加到PATH环境变量中)。2.在运行CMake,显式指定生成器为“MinGWMakefiles”,并且不要指定平台(因为MinGW生成器不支持平台指定)。例如:cmake-G"MinGWMakefiles".但是,如果用户想要生成64位程序,那么需要确保安装的是MinGW-w64(支持64位),并且在指定生成器CMake会自动检测并使用64位的编译器(如果系统中有多个编译器,可能需要通过环境变量或工具链文件指定)。另外,如果用户想使用VisualStudio的64位生成器,可以使用:cmake-G"VisualStudio162019"-Ax64.但是用户的问题是关于MinGW生成器的,所以我们主要解决MinGW的问题。总结步骤:步骤1:更新CMakeLists.txt中的最低版本要求-打开CMakeLists.txt,将第一行改为(假设你的项目支持3.10):cmake_minimum_required(VERSION3.10)步骤2:使用MinGW生成器并避免平台指定-在命令行中,使用以下命令生成Makefiles:cmake-G"MinGWMakefiles"-DCMAKE_BUILD_TYPE=Release.注意:这里没有指定平台(-Ax64),因为MinGW生成器不支持。MinGW生成器会使用默认的编译器架构(如果安装了MinGW-w6464位,那么就会生成64位代码)。步骤3:确保编译器可用-检查MinGW是否安装正确,可以在命令行中运行`gcc--version`或`g++--version`。如果找不到命令,需要将MinGW的bin目录(例如:C:\MinGW\bin)添加到PATH环境变量中。步骤4:如果仍然遇到编译器未设置的问题,可以尝试在CMake命令中指定C和C++编译器的路径(可选)cmake-G"MinGWMakefiles"-DCMAKE_C_COMPILER=C:/MinGW/bin/gcc.exe-DCMAKE_CXX_COMPILER=C:/MinGW/bin/g++.exe.注意:路径中的斜杠最好使用正斜杠(/)或双反斜杠(\\),避免使用单反斜杠(因为它是义字符)。步骤5:构建项目cmake--build.如果用户希望构建64位程序,请确保安装的是64位的MinGW(MinGW-w64)。32位的MinGW只能生成32位程序。关于引用[3]:它提到了一个替代方案,即避免从源代码编译(例如,使用预编译的库),但用户的问题是关于自己的CMake项目,所以我们不采用这种方法,除非用户的项目依赖项需要从源代码编译(比如OpenCV)。如果用户确实需要编译OpenCV,那么应该确保MinGW-w64已安装,并使用上面的步骤。相关问题:1.如何检查MinGW-w64是否安装正确?2.如何在Windows上设置PATH环境变量?3.如何指定CMake使用特定的编译器?4.如何解决CMake生成器不支持平台规范的问题?5.如何升级CMakeLists.txt以消除弃用警告?</think>### 解决CMake版本兼容性及MinGW Makefiles错误 #### 1. **CMake弃用警告修复** **问题分析**: 警告`Compatibility with CMake < 2.8.12 will be removed`表示项目指定的最低CMake版本过低,未来将不兼容旧版本[^1]。 **解决方案**: 修改`CMakeLists.txt`,更新`cmake_minimum_required`的版本范围: ```cmake cmake_minimum_required(VERSION 3.10...3.25) # 使用范围语法,兼容3.10及以上 project(YourProjectName) ``` - `3.10`是推荐的最低版本(根据项目需求调整) - 范围语法`...`声明兼容性上限,避免未来警告[^1]。 --- #### 2. **MinGW Makefiles不支持x64平台** **问题分析**: 错误`Generator MinGW Makefiles does not support platform specification x64`表明: - MinGW生成器无法直接通过`-A x64`指定64位平台[^1][^3] - 根本原因是MinGW工具链需独立配置64位编译器 **解决方案**: **步骤1:安装64位MinGW-w64** - 从[MSYS2官网](https://www.msys2.org/)下载安装 - 安装64位工具链: ```bash pacman -S mingw-w64-x86_64-toolchain ``` **步骤2:配置环境变量** 将MinGW-w64的`bin`目录加入`PATH`: ```bash # 示例路径(根据实际安装位置调整) PATH=C:\msys64\mingw64\bin;%PATH% ``` **步骤3:生成CMake构建文件** **无需指定`-A x64`**,直接使用MinGW生成器: ```bash cmake -G "MinGW Makefiles" -B build -DCMAKE_BUILD_TYPE=Release ``` - `-B build`:指定构建目录 - CMake会自动检测64位编译器(因PATH已配置) **步骤4:编译项目** ```bash cmake --build build --config Release ``` --- #### 3. **验证是否成功** 检查生成的二进制文件架构: ```bash # 进入构建目录 cd build # 查看可执行文件位数(Windows需安装file命令) file your_executable.exe ``` 输出应包含:`PE32+ executable (console) x86-64`(64位标识) --- ### 关键原理说明 1. **版本范围语法**: `VERSION 3.10...3.25`明确兼容CMake 3.10至3.25,避免未来弃用警告[^1]。 2. **MinGW平台适配**: MinGW生成器通过编译器路径隐式确定平台(32/64位),而非`-A`参数[^3]。配置64位`g++.exe`在PATH中即可自动识别。 --- ### 相关问题 1. **如何检查当前CMake支持的生成器?** `cmake --help`查看`Generators`列表,确认`MinGW Makefiles`是否存在。 2. **MinGW-w64与原生MinGW有何区别?** MinGW-w64支持64位编译和更完整的WinAPI,而原生MinGW仅限32位[^3]。 3. **CMake如何强制指定64位编译器?** 通过工具链文件设置: ```cmake set(CMAKE_C_COMPILER "gcc.exe") set(CMAKE_CXX_COMPILER "g++.exe") set(CMAKE_RC_COMPILER "windres.exe") ``` 4. **Windows下除MinGW还有哪些生成器可选?** - `Visual Studio 17 2022`(需安装VS) - `Ninja`(更快的构建速度) 5. **CMake版本升级后如何保持项目兼容性?** 使用`if()`条件判断CMake版本: ```cmake if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.12) # 新特性代码 else() # 旧版兼容代码 endif() ``` [^1]: CMake弃用警告和生成器错误参考 [^3]: MinGW-w64安装与平台适配解决方案
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值