Architecture CMake多体系结构编译

Architecture CMake多体系结构编译,architecture,compilation,cmake,Architecture,Compilation,Cmake,我想知道如何编写一个CMake设置程序,允许使用任何编译器和操作系统编译x86和x64体系结构。有一个在线工具,可以浏览CMake手册中的基础知识。CMake的理念是使用多个构建目录和一个源代码树。因此,您可以在Windows上使用Visual Studio,使用32位编译器创建一个构建目录,使用64位编译器创建另一个构建目录 CMake以大量编译器和操作系统为目标,但您没有提到您正在使用的语言、您正在考虑的操作系统/编译器/体系结构以及您是否正在使用任何工具包/库。如果CMake有一个现成的3

我想知道如何编写一个CMake设置程序,允许使用任何编译器和操作系统编译x86和x64体系结构。

有一个在线工具,可以浏览CMake手册中的基础知识。CMake的理念是使用多个构建目录和一个源代码树。因此,您可以在Windows上使用Visual Studio,使用32位编译器创建一个构建目录,使用64位编译器创建另一个构建目录


CMake以大量编译器和操作系统为目标,但您没有提到您正在使用的语言、您正在考虑的操作系统/编译器/体系结构以及您是否正在使用任何工具包/库。

如果CMake有一个现成的32/64位选项,那就太好了。它不是,因此您需要应用不同的编译器或生成器依赖的方法之一。例如:

  • GCC(在Linux上)和其他一些编译器,例如Sun Studio。将
    CFLAGS
    cxflags
    设置为包括
    -m32
    (32位构建)或
    -m64
    (64位构建)

  • Windows,Visual Studio生成器。使用64位生成器,例如

    cmake-G“Visual Studio 10 Win64”路径\to\source\dir

    编译64位(x64)。在生成器名称中省略“Win64”以生成32位

  • Mac OS X。使用
    CMAKE\u OSX\u体系结构
    CMAKE变量

    cmake-DCMAKE\u OSX\u architecture=i386/path/to/source/dir
    将编译32位构建

    cmake-DCMAKE\u OSX\u architecture=x86\u 64/path/to/source/dir
    将编译64位

    cmake“-DCMAKE\u OSX\u architecture=x86\u 64;i386”/path/to/source/dir
    将创建96位通用二进制文件:)

以上内容稍作修改

2019年4月更新

这是一个古老的答案,有些事情已经改变了,特别是对于Windows上的VS generator

安装了cmake 3.14和Visual Studio 2019

cmake-G“Visual Studio 16 2019”-一个x64路径\to\source\dir

编译64位(x64)。您通常可以在x64机器上同时省略-G和-A参数(您在2019年使用的是x64操作系统,对吗?)

cmake-G“Visual Studio 16 2019”-一个Win32路径\to\source\dir


编译32位。

如果CMAKE_OSX_ARCHITECTURES=i386出现错误“Unrecogned option-arch”,请重新开始,并尝试:

cmake -DCMAKE_SYSTEM_NAME=Darwin -DCMAKE_SYSTEM_PROCESSOR=i386 -DCMAKE_SYSTEM_VERSION=10

可能相关:这太棒了!但是对于VisualStudio来说,既然它是一个生成器,它不应该是-G吗?同样对于Visual Studio,是否可以在CMakeLists.txt文件中设置某种类型的标志来自动告诉它要使用哪个(即请求您选择i386或x86-64,并根据您的响应进行设置)?它应该是-G,并且必须在命令行上传递生成器。您还可以使用基于Qt的图形界面cmake gui,从下拉列表中选择合适的生成器。@OniLink,@Marcus。是的,应该是-G。非常感谢您的关注!我现在修复了它(也修复了MySQL Wiki中的同一段)。据我所知,在CMakeLists.txt中更改Visual Studio的位是不可能的,此处的位是生成器的属性,并且生成器不能动态设置/更改。使用MSVC工具链,您还可以在CMAKE文件中使用
set(CMAKE_EXE_LINKER_FLAGS)/machine:x86”)
(体系结构中的sub),64位和32位实际上是不同的编译器,不像gcc,在gcc中,architectue是传递给编译器的标志。我猜这就是原因。答案与问题无关。