使用cmake强制执行32位或64位构建的选项

Flo*_*ogo 16 c++ cmake 32bit-64bit

我想提供一种方法,始终将我的目标构建为32位或始终为64位可执行文件,并且cmake独立于主机系统(为gcc添加"-m32"或"-m64"标志,不确定然而,如何为其他编译器做什么).

我可以想到三种方法,我应该使用哪种方法?

  1. 一个选项(-DUSE32bit = true)
  2. 工具链(-DCMAKE_TOOLCHAIN_FILE = 64bit.toolchain)
  3. 构建类型(-DCMAKE_BUILD_TYPE = release32)

在我的情况下,强制32位构建将是默认的,应该易于使用.强制64位构建对某些情况也很有用,并且不应该太难.使用主机系统的位宽很少对我的情况有意义,我不想支持它.

我在这里找到了一个相关的问题(使用CMake强制进行32位编译的正确方法),但答案主要是讨论如何完成它,而不是如何使其可配置.

tre*_*esf 15

对于Visual Studio和https://cmake.org/cmake/help/latest/variable/CMAKE_GENERATOR_PLATFORM.html

对于VS 2005及更高版本的Visual Studio生成器,它指定了目标体系结构.

cmake . -DCMAKE_GENERATOR_PLATFORM=x64
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,还没有@TylerGubala。`cmake`的文档没有说明,但是看起来它的文档实际上在这里的`-A`标志中:https://cmake.org/cmake/help/v3.2/manual/cmake.1。 html,表示“ VS> 8”。另请参阅/sf/answers/1963295141/,其中讨论了将`-m32`标志添加到`gcc`中。注意,-m32可能不适用于所有编译器。在Linux / Unix上进行32位构建的首选方法是工具链文件,类似于为交叉编译准备构建环境的方法,也可在上面的链接中找到。 (2认同)
  • @tresf是的,即使我先删除“CMakeCache.txt”,我也确实需要“CACHE”部分。否则,当我尝试构建时,会收到此错误:“错误 MSB8013:该项目不包含 Debug|x64 的配置和平台组合” (2认同)

小智 5

TL; DR

使用工具链

深入

  1. 一个选项(-DUSE32bit = true)

我想这不可扩展.那么如果你想建立N个项目呢?您必须添加N个选项.

  1. 构建类型(-DCMAKE_BUILD_TYPE = release32)

这可能效果很好.但在我看来,你正在混合不相关的东西.此外,我确信你必须find_package通过设置一些*_ROOTCMake变量来调整行为.它是不可能的CMAKE_BUILD_TYPE(至少,再次,以可扩展的方式).

  1. 工具链(-DCMAKE_TOOLCHAIN_FILE = 64bit.toolchain)

最好的变种.如果你想构建两个项目 - 只需使用相同的工具链:

cmake -Hproj-1 -B_builds/proj-1 -DCMAKE_TOOLCHAIN_FILE=/.../64bit.toolchain
cmake -Hproj-2 -B_builds/proj-2 -DCMAKE_TOOLCHAIN_FILE=/.../64bit.toolchain
Run Code Online (Sandbox Code Playgroud)

如果你想用64位架构构建你的第三方ExternalProject_Add - 只需将工具链传递给CMAKE_ARGS:

ExternalProject_Add(
    ...
    CMAKE_ARGS ... -DCMAKE_TOOLCHAIN_FILE=/.../64bit.toolchain
    ...
)
Run Code Online (Sandbox Code Playgroud)

想要适应find_package- 只需将任何CMake变量添加到工具链文件中.