【米尔 NXP i.MX93 开发板评测】cmake交叉编译
本帖最后由 小麦克 于 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的工具,其编译流程如下图:
## 示例
### 目录结构
```bahs
$ tree
.
├── arm_linux_setup.cmake
├── CMakeLists.txt
└── hello.c
1 directory, 3 files
```
arm_linux_setup.cmake
这里的`aarch64-buildroot-linux-gnu-gcc`是通过`buildroot`生成的交叉编译器,其他编译器也可以用,名称有差异,记得替换
```cmake
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
cmake_minimum_required(VERSION 3.1.3)
project(hello)
set( HELLO_SRCS hello.c)
add_executable(${PROJECT_NAME} ${HELLO_SRCS})
```
hello.c
```c
#include <stdio.h>
int main(void)
{
printf("Hello, CMake\n");
return 0;
}
```
### 编译
在项目根目录下面新建一个`build`,放cmake生成的中间文件
```bash
mkdir build
cd build
cmake ..
# 编译成主机平台
make
# 编译成功生成x86-64平台hello
$ 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=d55b52333ab9da5f0b106b3af84a8d4ef78f9a02, for GNU/Linux 3.2.0, not stripped
```
交叉编译
```bash
# 交叉编译
rm -rf *
cmake -DCMAKE_TOOLCHAIN_FILE=../arm_linux_setup.cmake ..
make
# 交叉编译成功生成aarch64平台hello
$ 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
```
上传开发板执行试试~
<p>cmake确实好用,以前还去学了Makefile,不过学了也没坏处。</p>
页:
[1]