CMake 交叉编译 - 每个平台单独调用?

CMake cross compile - separate invocation per platform?

我是 CMake 的新手,我正在使用它进行交叉编译。

我在 Debian 下同时使用 clang 和 wclang 分别为 Linux 和 Windows 编译。

我的问题——因为我是 CMake 的交叉编译过程的新手——是我:

(a) 在 CMakeLists.txt、

期间的某处在编译器之间切换

(b) 运行 cmake 仅一次,但每个平台 make install,或

(c) 运行 cmakemake install 每个平台一次,例如

$ export CC=/usr/bin/clang $ cmake .. $ make install

$ export CC=/usr/bin/wclang $ cmake .. $ make install

(等等)

?

应为每个目标重复所有步骤(cmake - make - install)。也就是说,"c" 在您的列表中。


一些开发环境,例如Visual Studio,支持多配置,即项目可以配置一次,每个目标配置只需要构建。这种方式的项目可以在Debug和Release模式下编译,或者x86和x86-64。

但是 Windows 和 Linux 目标在任何情况下都需要不同的配置步骤 (cmake 运行)。

C),每个平台单独调用。我还建议清除构建之间的二进制目录,或者如果要保留构建,则为每个构建使用单独的目录。

设置通常在 工具链文件 中完成,而不是命令行(为了可重现性):

$ cmake --help-variable CMAKE_TOOLCHAIN_FILE
CMAKE_TOOLCHAIN_FILE
--------------------

Path to toolchain file supplied to ``cmake(1)``.

This variable is specified on the command line when cross-compiling with CMake.
It is the path to a file which is read early in the CMake run and which specifies
locations for compilers and toolchain utilities, and other target platform and
compiler related information.

一个简单的工具链文件可能如下所示:

# Name of the target operating system
set( CMAKE_SYSTEM_NAME Windows )

# Which compilers to use
find_program( CMAKE_C_COMPILER   NAMES /opt/mxe/usr/bin/x86_64-w64-mingw32.static-gcc )
find_program( CMAKE_CXX_COMPILER NAMES x86_64-w64-mingw32.static-g++ )
find_program( CMAKE_RC_COMPILER  NAMES x86_64-w64-mingw32.static-windres )

# Where to look for resources
set( CMAKE_FIND_ROOT_PATH /opt/mxe/usr/x86_64-w64-mingw32.static/ )

# Adjust find_*() behavior:
# Headers and libs from the target environment,
# programs from the host environment.
set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )
set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )

一些交叉编译环境,如 MXE,带有预制的工具链文件和调用它们的包装器。 (特别是 MXE,您 运行 i686-w64-mingw32.static-cmake 而不是标准 cmake 来配置您的构建。)