本帖最后由 小麦克 于 2024-8-13 15:48 编辑
cmake交叉编译模版工程
本文通过一个简单的示例,演示如何在 CMake 工程中添加交叉编译的配置,实现编译不同硬件平台的可执行文件。
CMake概述
CMake 是一个项目构建工具,并且是跨平台的。关于项目构建我们所熟知的还有Makefile(通过 make 命令进行项目的构建),大多是IDE软件都集成了make,比如:VS 的 nmake、linux 下的 GNU make、Qt 的 qmake等,如果自己动手写 makefile,会发现,makefile 通常依赖于当前的编译平台,而且编写 makefile 的工作量比较大,解决依赖关系时也容易出错。
而 CMake 恰好能解决上述问题, 其允许开发者指定整个工程的编译流程,在根据编译平台,自动生成本地化的Makefile和工程文件,最后用户只需make编译即可,所以可以把CMake看成一款自动生成 Makefile的工具,其编译流程如下图:
示例
目录结构
$ tree
.
├── arm_linux_setup.cmake
├── CMakeLists.txt
└── hello.c
1 directory, 3 files
arm_linux_setup.cmake
这里的aarch64-buildroot-linux-gnu-gcc
是通过buildroot
生成的交叉编译器,其他编译器也可以用,名称有差异,记得替换
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(target_arch aarch64-linux-gnu)
set(CMAKE_C_COMPILER aarch64-buildroot-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-buildroot-linux-gnu-g++)
set(CMAKE_LIBRARY_ARCHITECTURE ${target_arch} CACHE STRING "" FORCE)
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)
CMakeLists.txt
cmake_minimum_required(VERSION 3.1.3)
project(hello)
set( HELLO_SRCS hello.c)
add_executable(${PROJECT_NAME} ${HELLO_SRCS})
hello.c
#include <stdio.h>
int main(void)
{
printf("Hello, CMake\n");
return 0;
}
编译
在项目根目录下面新建一个build
,放cmake生成的中间文件
mkdir build
cd build
cmake ..
make
$ file hello
hello: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=d55b52333ab9da5f0b106b3af84a8d4ef78f9a02, for GNU/Linux 3.2.0, not stripped
交叉编译
rm -rf *
cmake -DCMAKE_TOOLCHAIN_FILE=../arm_linux_setup.cmake ..
make
$ file hello
hello: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 6.1.0, not stripped
上传开发板执行试试~