• CMAKE 调用交叉编译器(CMAKE使用)


    CMAKE命令使用时需要与CMakeLists.txt在不同的目录下,一般是在CMakeList.txt文档所在的目录下创建一个build文件夹,然后cd到build文件夹,执行cmake ..,此时会根据CMakeLists.txt将需要的配置文件生成到build目录下,然后在build目录下执行make

    嵌入式设备应用时,需要在X86架构下编译板卡需要的ARM架构的文件,需要配置交叉编译器等来完成。这时就需要编写.cmake文件来实现配置,在运行cmake命令时添加-DCMAKE_TOOLCHAIN_FILE=*.cmake,在build目录下执行cmake -DDCMAKE_TOOLCHAIN_FILE=*.cmake ..

    *.cmake文件的编写方法及理解如下:转自网址

    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)

    cmake_minimum_required( VERSION 2.6.3 )
    
    SET(CMAKE_SYSTEM_NAME Linux)
    SET(CMAKE_C_COMPILER "aarch64-linux-gcc")
    SET(CMAKE_CXX_COMPILER "aarch64-linux-g++")
    #SET(CMAKE_SYSTEM_PROCESSOR "armv7-a")
    SET(CMAKE_SYSTEM_PROCESSOR "armv8-a")
    
    add_definitions(-fPIC)
    add_definitions(-DARMLINUX)
    add_definitions(-D__gnu_linux__)
     

    这样就完成了相关配置文件的编写,之后就可以灵活指定采用宿主机编译还是交叉编译,仅仅-DDCMAKE_TOOLCHAIN_FILE=*.cmake的差异。

     
  • 相关阅读:
    uvm_cookbook--sequences--wait for a signal
    Makefile目标文件搜索(VPATH和vpath
    git stash
    vuex-persist,解决vuex中的数据刷新页面之后丢失的问题
    element表格中的输入框有时会存在输入不上的情况
    简单 Linux 文件系统?
    Shell 脚本是什么?
    什么是BASH?
    如何规划一台 Linux 主机,步骤是怎样?
    什么是GUI?
  • 原文地址:https://www.cnblogs.com/lidabo/p/16648999.html
Copyright © 2020-2023  润新知