CMake之交叉编译

一、引言
很多时候,我们在开发的时候是面对嵌入式平台,因此由于资源的限制需要用到相关的交叉编译。即在你host宿主机上要生成target目标机的程序。里面牵扯到相关头文件的切换和编译器的选择以及环境变量的改变等,我今天仅仅简单介绍下相关CMake在面对交叉编译的时候,需要做的一些准备工作。

二、CMake交叉编译配置

CMake给交叉编译预留了一个很好的变量即CMAKE_TOOLCHAIN_FILE,它定义了一个文件的路径,这个文件即toolChain,里面set了一系列你需要改变的变量和属性,包括C_COMPILER,CXX_COMPILER,如果用Qt的话需要更改QT_QMAKE_EXECUTABLE以及如果用BOOST的话需要更改的BOOST_ROOT(具体查看相关Findxxx.cmake里面指定的路径)。CMake为了不让用户每次交叉编译都要重新输入这些命令,因此它带来toolChain机制,简而言之就是一个cmake脚本,内嵌了你需要改变以及需要set的所有交叉环境的设置。这里面也牵扯了一些相关的变量设置,在这里简单介绍下几个比较重要的。

1.CMAKE_SYSTEM_NAME: 即你目标机target所在的操作系统名称,比如ARM或者Linux你就需要写"Linux",如果Windows平台你就写"Windows",如果你的嵌入式平台没有相关OS你即需要写成"Generic",只有当CMAKE_SYSTEM_NAME这个变量被设置了,CMake才认为此时正在交叉编译,它会额外设置一个变量CMAKE_CROSSCOMPILING为TRUE。

2. CMAKE_C_COMPILER: 顾名思义,即C语言编译器,这里可以将变量设置成完整路径或者文件名,设置成完整路径有一个好处就是CMake会去这个路径下去寻找编译相关的其他工具比如linker,binutils等,如果你写的文件名带有arm-elf等等前缀,CMake会识别到并且去寻找相关的交叉编译器。

3. CMAKE_CXX_COMPILER: 同上,此时代表的是C++编译器。

4. CMAKE_FIND_ROOT_PATH: 代表了一系列的相关文件夹路径的根路径的变更,比如你设置了/opt/arm/,所有的Find_xxx.cmake都会优先根据这个路径下的/usr/lib,/lib等进行查找,然后才会去你自己的/usr/lib和/lib进行查找,如果你有一些库是不被包含在/opt/arm里面的,你也可以显示指定多个值给CMAKE_FIND_ROOT_PATH,比如
set(CMAKE_FIND_ROOT_PATH /opt/arm /opt/inst)

5.  CMAKE_FIND_ROOT_PATH_MODE_PROGRAM: 对FIND_PROGRAM()起作用,有三种取值,NEVER,ONLY,BOTH,第一个表示不在你CMAKE_FIND_ROOT_PATH下进行查找,第二个表示只在这个路径下查找,第三个表示先查找这个路径,再查找全局路径,对于这个变量来说,一般都是调用宿主机的程序,所以一般都设置成NEVER。

6. CMAKE_FIND_ROOT_PATH_MODE_LIBRARY: 对FIND_LIBRARY()起作用,表示在链接的时候的库的相关选项,因此这里需要设置成ONLY来保证我们的库是在交叉环境中找的。

7. CMAKE_FIND_ROOT_PATH_MODE_INCLUDE: 对FIND_PATH()和FIND_FILE()起作用,一般来说也是ONLY,如果你想改变,一般也是在相关的FIND命令中增加option来改变局部设置,有NO_CMAKE_FIND_ROOT_PATH,ONLY_CMAKE_FIND_ROOT_PATH,BOTH_CMAKE_FIND_ROOT_PATH

8. BOOST_ROOT:对于需要boost库的用户来说,相关的boost库路径配置也需要设置,因此这里的路径即ARM下的boost路径,里面有include和lib。

9. QT_QMAKE_EXECUTABLE: 对于Qt用户来说,需要更改相关的qmake命令切换成嵌入式版本,因此这里需要指定成相应的qmake路径(指定到qmake本身)。

以下是Demo,以供参考:

# this is required
SET(CMAKE_SYSTEM_NAME Linux)

# specify the cross compiler
SET(CMAKE_C_COMPILER   /opt/arm/usr/bin/ppc_74xx-gcc)
SET(CMAKE_CXX_COMPILER /opt/arm/usr/bin/ppc_74xx-g++)

# where is the target environment 
SET(CMAKE_FIND_ROOT_PATH  /opt/arm/ppc_74xx /home/rickk/arm_inst)

# search for programs in the build host directories (not necessary)
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

# configure Boost and Qt
SET(QT_QMAKE_EXECUTABLE /opt/qt-embedded/qmake)
SET(BOOST_ROOT /opt/boost_arm)

这样就完成了相关toolChain的编写,之后,你可以灵活的选择到底采用宿主机版本还是开发机版本,之间的区别仅仅是一条-DCMAKE_TOOLCHAIN_FILE=./toolChain.cmake,更爽的是,如果你有很多程序需要做转移,但目标平台是同一个,你仅仅需要写一份toolChain放在一个地方,就可以给所有工程使用。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: CMake 是一个跨平台的开源构建工具,它可以自动生成构建脚本来编译源代码。CMake 使用 CMakeLists.txt 文件来配置项目的构建过程。 在使用 CMake 进行交叉编译时,需要针对目标平台进行配置。以下是一些常见的配置步骤: 1. 创建一个目标平台交叉编译的文件夹,例如 "build_cross",进入该文件夹。 2. 创建一个 CMakeLists.txt 文件来配置项目。在该文件中,使用 `cmake_minimum_required`,`project` 和 `set` 命令来定义 CMake 项目的最低版本、项目名称和目标平台。 3. 使用 `set` 命令设置目标平台的交叉编译器和工具链。例如,`set(CMAKE_C_COMPILER arm-linux-gnueabi-gcc)` 和 `set(CMAKE_CXX_COMPILER arm-linux-gnueabi-g++)` 可以设置 C 和 C++ 的交叉编译器。 4. 使用 `set` 命令设置目标平台的系统根目录。例如,`set(CMAKE_SYSROOT /path/to/sysroot)` 可以设置目标平台的系统根目录。该目录包含目标平台的头文件和库文件。 5. 使用 `set` 命令设置目标平台的系统库路径。例如,`set(CMAKE_LIBRARY_PATH /path/to/lib)` 可以设置目标平台的系统库路径。 6. 使用 `set` 和 `link_directories` 命令设置目标平台的库文件路径。例如,`set(LIBRARY_OUTPUT_PATH /path/to/output/lib)` 和 `link_directories(/path/to/libs)` 可以设置库文件的输出路径和库文件的搜索路径。 7. 使用 `add_executable` 命令添加项目的可执行文件。例如,`add_executable(myapp main.cpp)` 可以添加名为 "myapp" 的可执行文件,并指定源文件。 8. 使用 `target_link_libraries` 命令链接目标平台的库文件。例如,`target_link_libraries(myapp mylib)` 可以链接名为 "mylib" 的库文件。 9. 运行 CMake 进行配置和生成构建脚本。例如,`cmake /path/to/source/code` 可以运行 CMake。 10. 使用生成的构建脚本来进行交叉编译。例如,使用 Makefile,执行 `make` 命令来编译和构建项目。 通过以上步骤,我们可以使用 CMake 配置并进行交叉编译,以生成针对目标平台的可执行文件或库文件。具体的配置步骤可能因不同的目标平台和项目而略有不同,但以上提及的步骤是常见的基本过程。 ### 回答2: CMake是一个跨平台的开源构建工具,可以帮助我们管理和配置项目的构建流程。在某些情况下,我们可能需要使用CMake进行交叉编译,即在一个平台上生成可以在另一个不同架构或操作系统上运行的可执行文件。下面是一个简单的流程,用于配置CMake进行交叉编译。 首先,在命令行中创建一个新的目录,用于存放交叉编译的结果。然后,进入此目录,并执行以下命令: ``` cmake <path_to_source> -DCMAKE_TOOLCHAIN_FILE=<path_to_toolchain_file> ``` - `<path_to_source>`:指定源代码所在的路径。 - `<path_to_toolchain_file>`:指定用于交叉编译的工具链文件的路径。 工具链文件是一个描述了交叉编译工具链及其设置的CMake脚本文件。根据你的具体情况,这个文件可能会有所不同。例如,对于ARM架构的交叉编译,你可以使用arm-linux-gnueabi工具链,而对于嵌入式Linux系统的交叉编译,可以使用yocto工具链。 在工具链文件中,你可以设置一些变量来指定交叉编译所需的工具和库的位置。例如,你可以设置C、C++编译器、链接器、头文件和库文件的搜索路径等。 完成配置后,运行以下命令进行编译: ``` cmake --build . ``` 这会根据你的CMakeLists.txt文件生成交叉编译所需的构建文件,并进行编译。 配置交叉编译可能需要一些额外的设置和注意事项,例如设置环境变量、指定目标平台和架构等。因此,你可能需要根据具体的需求进行进一步的研究和调整。希望这个简单的介绍能够帮助你开始配置CMake进行交叉编译。 ### 回答3: CMake是一个跨平台的开源构建工具,它支持自动生成用于不同平台、不同编译器的编译脚本。在进行交叉编译时,可以通过配置CMake来生成适用于目标平台的编译器和工具链。 首先,需要将目标平台的交叉编译器和工具链配置到CMake中。这可以通过设置CMake变量来实现,如:CMAKE_C_COMPILER、CMAKE_CXX_COMPILER等。根据目标平台的特性,将相应的交叉编译器路径赋值给这些变量。 其次,需要在CMakeLists.txt文件中添加适用于交叉编译的配置信息。可以通过设置TARGET_ARCHITECTURE变量来指定目标平台的体系结构,例如ARM、MIPS等。然后,使用SET(CMAKE_SYSTEM_NAME)命令设置目标操作系统的名称,如Linux、Windows等。 然后,根据交叉编译器的特性,配置编译选项和链接选项。可以使用SET(CMAKE_C_FLAGS)和SET(CMAKE_EXE_LINKER_FLAGS)等命令来设置特定的选项。例如,设置编译器标志、库路径、库文件名等以适应交叉编译环境。 最后,运行cmake命令来生成适用于交叉编译的Makefile或其他构建脚本。可以在命令行中执行cmake命令,指定源码目录和编译输出目录。CMake将根据配置文件生成适用于交叉编译环境的构建脚本。 通过以上步骤,就可以配置CMake来进行交叉编译。在生成的构建脚本中,将使用配置的交叉编译器和工具链来编译和链接代码,以生成适用于目标平台的可执行文件或库。在整个过程中,需要根据目标平台的不同特性来配置相应的参数和选项,以确保交叉编译的正确进行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值