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

CMake交叉编译-每个平台单独调用?,cmake,clang,cross-compiling,Cmake,Clang,Cross Compiling,我是CMake的新手,我正在使用它进行交叉编译 我在Debian下使用clang和together分别为Linux和Windows编译 我的问题是——因为我是CMake交叉编译过程的新手——我是否: (a) 在CMakeLists.txt期间在编译器之间切换 (b) 只运行一次cmake,但对每个平台执行makeinstall,或 (c) 为每个平台运行一次cmake和makeinstall,例如 $export CC=/usr/bin/clang $cmake。。 $make安装 $expor

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

我在Debian下使用clang和together分别为Linux和Windows编译

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

(a) 在CMakeLists.txt期间在编译器之间切换

(b) 只运行一次
cmake
,但对每个平台执行
makeinstall
,或

(c) 为每个平台运行一次
cmake
makeinstall
,例如

$export CC=/usr/bin/clang
$cmake。。
$make安装

$export CC=/usr/bin/wclang
$cmake。。
$make安装

(等等)

所有步骤(cmake-make-install)都应针对每个目标重复。即列表中的“c”


某些开发环境(例如Visual Studio)支持多配置,即项目可以配置一次,而每个目标配置只需要构建。这种方式可以在调试和发布模式下编译项目,或者针对x86和x86-64编译项目

但是Windows和Linux目标在任何情况下都需要不同的配置步骤(
cmake
run)。所有步骤(cmake-make-install)都应该对每个目标重复。即列表中的“c”


某些开发环境(例如Visual Studio)支持多配置,即项目可以配置一次,而每个目标配置只需要构建。这种方式可以在调试和发布模式下编译项目,或者针对x86和x86-64编译项目

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

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

设置通常在工具链文件中完成,而不是在命令行中完成(为了便于复制):

简单的工具链文件可以如下所示:

# 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,您可以运行
i686-w64-mingw32.static cmake
而不是标准的
cmake
来配置构建。)

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

设置通常在工具链文件中完成,而不是在命令行中完成(为了便于复制):

简单的工具链文件可以如下所示:

# 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,您可以运行
i686-w64-mingw32.静态cmake
而不是标准的
cmake
来配置构建。)

这种方法(c)是否需要为每个正在构建的平台提供单独的目标名称?否则,CMake只生成一个(一组)全局生成文件,而不是为每个平台生成一个;在这一点上,我不知道如何区分构建。@ArcaneEngineer:我不理解你的问题。您可以创建一个目录,例如
projectlinux
,并在其中为Linux目标构建项目。然后创建一个不同的目录,例如
project Windows
,并在其中为Windows目标构建项目。区分构建应该很容易。。。?如果您
cpack
它们,您甚至可以将系统名作为包文件名的一部分……啊哈,好的。到目前为止,我只使用了一个文件夹来让CMake本身工作(这是您的回答帮助我做到的)。既然如此,我可能应该按照您的建议区分文件夹。再次感谢。@Arcaneer工程师:我仍然不确定我是否能遵循你的思路。标准的CMake过程是拥有一个源代码树,在构建过程中不会触及该源代码树或添加任何文件。您可以在一个单独的目录中进行构建(或多个构建)。@ArcaneEngineer:我可以大胆地宣传一个现成的CMake配置框架吗?它还没有完成,但我认为它可以很好地说明使用CMake可以做什么。这种方法(c)是否需要为每个正在构建的平台指定一个单独的目标名称?否则,CMake只生成一个(一组)全局生成文件,而不是为每个平台生成一个;在这一点上,我不知道如何区分构建。@ArcaneEngineer:我不理解你的问题。您可以创建一个目录,例如
projectlinux
,并在其中为Linux目标构建项目。然后创建一个不同的目录,例如
project Windows
,并在其中为Windows目标构建项目。区分构建应该很容易。。。?如果您
cpack
它们,您甚至可以将系统名作为包文件名的一部分……啊哈,好的。到目前为止,我只使用了一个文件夹来让CMake本身工作(这是您的回答帮助我做到的)。既然如此,我可能应该按照您的建议区分文件夹。再次感谢。@Arcaneer工程师:我仍然不确定我是否能遵循你的思路。标准的CMake过程是拥有一个源代码树,在构建过程中不会触及该源代码树或添加任何文件。您可以在一个单独的目录中进行构建(或多个构建)。@ArcaneEngineer:我可以大胆地宣传一个现成的CMake配置框架吗?它还没有完成,但我认为它可以提供一个很好的想法,用CMake可以做什么。