使用 cmake 强制构建 32 位或 64 位的选项
Option to force either 32-bit or 64-bit build with cmake
我想提供一种方法,始终将我的目标构建为 32 位或始终作为 64 位可执行文件,使用独立于主机系统的 cmake 可执行文件(添加“-m32”或“-m64”标志对于 gcc,还不确定如何为其他编译器做些什么)。
我可以想到三种方法来做到这一点,我应该使用哪一种?
- 一个选项 (-DUSE32bit=true)
- 一个工具链(-DCMAKE_TOOLCHAIN_FILE=64bit.toolchain)
- 构建类型(-DCMAKE_BUILD_TYPE=release32)
在我的例子中,强制的 32 位构建将是默认的并且应该易于使用。强制 64 位构建在某些情况下也很有用,应该不会太困难。使用主机系统的位宽对我的情况很少有意义,我不想支持它。
我在这里找到了一个相关问题 (The proper way of forcing a 32-bit compile using CMake),但答案主要讨论的是如何完成,而不是如何最好地使其可配置。
TL;DR
使用工具链
深入
- an option (-DUSE32bit=true)
我猜这是不可扩展的。那么如果要构建N个项目怎么办?您必须添加 N 个选项。
- build types (-DCMAKE_BUILD_TYPE=release32)
这可能效果很好。但在我看来,你在混合不相关的东西。此外,我确定您必须通过设置一些 *_ROOT
CMake 变量来调整 find_package
行为。用 CMAKE_BUILD_TYPE
不可能做到这一点(至少,再次以可扩展的方式)。
- a tool chain (-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
如果您想使用 64 位架构构建您的第 3 方 ExternalProject_Add - 只需将工具链传递给 CMAKE_ARGS:
ExternalProject_Add(
...
CMAKE_ARGS ... -DCMAKE_TOOLCHAIN_FILE=/.../64bit.toolchain
...
)
想要适应 find_package
- 只需将任何 CMake 变量添加到工具链文件即可。
Visual Studio 和 https://cmake.org/cmake/help/latest/variable/CMAKE_GENERATOR_PLATFORM.html
For Visual Studio Generators with VS 2005 and above this specifies the target architecture.
cmake . -DCMAKE_GENERATOR_PLATFORM=x64
就我个人而言,我想在 Visual studio / cmake 配置的同一解决方案中切换到 32/64 位项目。我发现这可以使用
来完成
set_target_properties(${project} PROPERTIES LINK_FLAGS ${PROJ_LINK_FLAGS})
其中 PROJ_LINK_FLAGS
可以是 /MACHINE:X86
或 /MACHINE:X64
,具体取决于编译。
感谢您的所有意见,但在我这边,我最终选择了使用 cmake 的 -m32 hack
# cmake windows 32 bits mode bug: 32 bits link mode must be explicit (otherwise cmake will always guess a 64 bits target)
# 1- run "vcbarsall.bat x86" to setup Visual Studio build profile
# 2- "set cflags=-m32" and "set cxxflags=-m32"
# 3- let the cmake plugin "automatically" guess the target platform
我想提供一种方法,始终将我的目标构建为 32 位或始终作为 64 位可执行文件,使用独立于主机系统的 cmake 可执行文件(添加“-m32”或“-m64”标志对于 gcc,还不确定如何为其他编译器做些什么)。
我可以想到三种方法来做到这一点,我应该使用哪一种?
- 一个选项 (-DUSE32bit=true)
- 一个工具链(-DCMAKE_TOOLCHAIN_FILE=64bit.toolchain)
- 构建类型(-DCMAKE_BUILD_TYPE=release32)
在我的例子中,强制的 32 位构建将是默认的并且应该易于使用。强制 64 位构建在某些情况下也很有用,应该不会太困难。使用主机系统的位宽对我的情况很少有意义,我不想支持它。
我在这里找到了一个相关问题 (The proper way of forcing a 32-bit compile using CMake),但答案主要讨论的是如何完成,而不是如何最好地使其可配置。
TL;DR
使用工具链
深入
- an option (-DUSE32bit=true)
我猜这是不可扩展的。那么如果要构建N个项目怎么办?您必须添加 N 个选项。
- build types (-DCMAKE_BUILD_TYPE=release32)
这可能效果很好。但在我看来,你在混合不相关的东西。此外,我确定您必须通过设置一些 *_ROOT
CMake 变量来调整 find_package
行为。用 CMAKE_BUILD_TYPE
不可能做到这一点(至少,再次以可扩展的方式)。
- a tool chain (-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
如果您想使用 64 位架构构建您的第 3 方 ExternalProject_Add - 只需将工具链传递给 CMAKE_ARGS:
ExternalProject_Add(
...
CMAKE_ARGS ... -DCMAKE_TOOLCHAIN_FILE=/.../64bit.toolchain
...
)
想要适应 find_package
- 只需将任何 CMake 变量添加到工具链文件即可。
Visual Studio 和 https://cmake.org/cmake/help/latest/variable/CMAKE_GENERATOR_PLATFORM.html
For Visual Studio Generators with VS 2005 and above this specifies the target architecture.
cmake . -DCMAKE_GENERATOR_PLATFORM=x64
就我个人而言,我想在 Visual studio / cmake 配置的同一解决方案中切换到 32/64 位项目。我发现这可以使用
来完成set_target_properties(${project} PROPERTIES LINK_FLAGS ${PROJ_LINK_FLAGS})
其中 PROJ_LINK_FLAGS
可以是 /MACHINE:X86
或 /MACHINE:X64
,具体取决于编译。
感谢您的所有意见,但在我这边,我最终选择了使用 cmake 的 -m32 hack
# cmake windows 32 bits mode bug: 32 bits link mode must be explicit (otherwise cmake will always guess a 64 bits target)
# 1- run "vcbarsall.bat x86" to setup Visual Studio build profile
# 2- "set cflags=-m32" and "set cxxflags=-m32"
# 3- let the cmake plugin "automatically" guess the target platform