CMake 交叉编译学习(使用CPack打成deb包)

CMake 交叉编译学习

一、交叉编译环境搭建

  1. 编译主机系统:Ubunbtu 20.04 LTS
  2. 确定硬件架构名称:uname -m
  3. 下载对应编译器,可通过以下命令下载
1. uname -m 为 armv7l
sudo apt install gcc-9-arm-linux-gnueabihf g++-9-arm-linux-gnueabihf

2. uname -m 为 aarch64
sudo apt install gcc-9-aarch64-linux-gnu g++-9-aarch64-linux-gnu

注:如果系统版本低于Ubunbtu 20.04,如18.04,apt gcc交叉编译器最高版本为gcc-8

二、交叉编译 Simple Example

main.cpp 链接动态库,生成可执行文件(目标机器为armv7l)

1. 目录结构

source_dir_tree

2. 顶层CMakeLists.txt

编译并打包成.deb

cmake_minimum_required(VERSION 3.15)
project(cross_compile_learning
        VERSION 0.1.0
        DESCRIPTION 交叉编译学习)

set(CMAKE_CXX_STANDARD 17)
add_compile_options(-fPIC -Wall -Wextra -Wno-psabi)

message("CMAKE_TOOLCHAIN_FILE: ${CMAKE_TOOLCHAIN_FILE}")

set(DEFAULT_RUNPATH ${CMAKE_INSTALL_PREFIX}/lib)

add_subdirectory(src)

add_executable(cross_compile main.cpp)
target_link_libraries(cross_compile my_alg)
target_link_directories(cross_compile PUBLIC src)
target_include_directories(cross_compile PUBLIC ${CMAKE_SOURCE_DIR}/include)
set_target_properties(cross_compile PROPERTIES INSTALL_RPATH ${DEFAULT_RUNPATH})

install(
    TARGETS cross_compile my_alg
    RUNTIME DESTINATION bin
    LIBRARY DESTINATION lib
    ARCHIVE DESTINATION lib
    PUBLIC_HEADER DESTINATION include
)

set(CPACK_PACKAGING_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX})
set(CPACK_GENERATOR "DEB")
set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "armhf")
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "micah")
include(CPack)

  • cmake文档地址:
    • 指令文档地址:https://cmake.org/cmake/help/latest/command/ + {command} + .html
    • 变量文档地址:https://cmake.org/cmake/help/latest/variable/ + {VARIABLE} + .html
  • set_target_properties(cross_compile PROPERTIES INSTALL_RPATH ${DEFAULT_RUNPATH})
  • install(...)
    • TARGETS cross_compile my_alg 安装cross_compile, my_alg
    • RUNTIME DESTINATION bin 将依赖的可执行文件放到安装目录下的bin文件夹中(默认),可更改放到其他文件夹中
    • LIBRARY DESTINATION lib 将依赖的.so动态库文件放到安装目录下的lib文件夹中(默认),可更改放到其他文件夹中
    • ARCHIVE DESTINATION lib 将依赖的.a静态库文件放到安装目录下的lib文件夹中(默认),可更改放到其他文件夹中
    • 对于Windows, MacOS系统,RUNTIME, LIBRARY, ARCHIVE有其他含义,具体参考:https://cmake.org/cmake/help/latest/command/install.html
  • set(CPACK_PACKAGING_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX}) 设置安装目录,同时会用CMAKE_INSTALL_RPATH替换CMAKE_BUILD_RPATH
  • set(CPACK_GENERATOR "DEB") 设置打包为.deb
  • set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "armhf") 设置目标架构,不设置默认为dpkg --print-architecture结果
  • set(CPACK_DEBIAN_PACKAGE_MAINTAINER "micah") 设置包管理者,不设置默认为CPACK_PACKAGE_CONTACT
  • 参考:CPackCPack DEB Generator

3. src/CMakeLists.txt

add_library(my_alg SHARED alg.cpp)

4. platform/armhf.cmake

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

# set(CMAKE_SYSROOT /path/to/sys-rootfs)

set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc-9)
set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++-9)

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
  • 交叉编译参考:cmake-toolchains
  • CMAKE_SYSTEM_NAME 设置要构建的目标平台的 CMake 标识符
  • CMAKE_SYSTEM_PROCESSOR 设置要构建的目标架构的 CMake 标识符
  • CMAKE_SYSROOT 可选,传递--sysroot=dir,即修改库和头文件搜索路径,头文件搜索路径由原来的/usr/include变为dir/usr/include,库搜索路径由原来的/usr/lib变为dir/usr/lib

gcc_sysroot

5. 交叉编译指令

rm -rf build
mkdir build
cd build
cmake -DCMAKE_TOOLCHAIN_FILE=../platform/armhf.cmake -DCMAKE_INSTALL_PREFIX=/usr/local/cross_compile_learning  ..
make -j4
cpack

6. deb包查看和安装

  • 查看包信息

deb_info

  • 查看包目录结构

deb_tree

  • 解压包到extract目录
dpkg -x cross_compile_learning-0.1.0-Linux.deb extract
  • 打印可执行文件dynamic section内容

dynamic_section

  • 安装(需要将deb包拷贝至目标设备上)

deb_install

  • 运行
/usr/local/cross_compile_learning/bin/cross_compile

7. 源代码参考: github

三、CMake学习参考

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值