CMake交叉编译配置

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

    CMake给交叉编译预留了一个很好的变量即CMAKE_TOOLCHAIN_FILE,它定义了一个文件的路径,这个文件即toolChain,里面set了一系列你须要改变的变量和属性,包括C_COMPILER,CXX_COMPILER,若是用Qt的话须要更改QT_QMAKE_EXECUTABLE以及若是用BOOST的话须要更改的BOOST_ROOT(具体查看相关Findxxx.cmake里面指定的路径)。CMake为了避免让用户每次交叉编译都要从新输入这些命令,所以它带来toolChain机制,简而言之就是一个cmake脚本,内嵌了你须要改变以及须要set的全部交叉环境的设置。ui

    这里面也牵扯了一些相关的变量设置,在这里简单介绍下几个比较重要的this

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

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

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

    4. CMAKE_FIND_ROOT_PATH: 表明了一系列的相关文件夹路径的根路径的变动,好比你设置了/opt/arm/,全部的Find_xxx.cmake都会优先根据这个路径下的/usr/lib,/lib等进行查找,而后才会去你本身的/usr/lib和/lib进行查找,若是你有一些库是不被包含在/opt/arm里面的,你也能够显示指定多个值给CMAKE_FIND_ROOT_PATH,好比blog

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下进行查找,第二个表示只在这个路径下查找,第三个表示先查找这个路径,再查找全局路径,对于这个变量来讲,通常都是调用宿主机的程序,因此通常都设置成NEVERci

    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放在一个地方,就能够给全部工程使用。

    CMake交叉编译配置就介绍到这,转移之间我来博客园也2个多月了,感觉颇多,但愿你会喜欢这篇文章 : ) 而且给我一点鼓励。

 

参考连接: http://www.cmake.org/Wiki/CMake_Cross_Compiling