crosstool-ng
1.1、crosstool-ng简介
是什么 ?:a cross-compilation toolchain generator which supports many architectures and components and has a simple yet powerful menuconfig-style interface.
开发语言:C
官方主页:http://crosstool-ng.github.io
源码仓库:https://github.com/crosstool-ng/crosstool-ng
1.2、通过包管理器安装crosstool-ng
操作系统包管理器安装命令
Windowsscoopscoop install crosstool-ng
WindowsChocolateychoco install -y crosstool-ng
macOSHomeBrewbrew install crosstool-ng
GNU/LinuxHomeBrewbrew install crosstool-ng
openSUSEzyppersudo zypper install -y crosstool-ng

Arch Linux

ArcoLinux

Manjaro Linux

pacmanyay -Syyu --noconfirm
yay -S    --noconfirm crosstool-ng
1.3、通过编译源码安装crosstool-ng
1.4、ct-ng命令

ct-ng本质上是一个Makefile,以make -rf $0的方式自执行。因此,ct-ng命令的使用格式与gmake完全一样。 只是ct-ng提供了很多target

1.4.1、ct-ng help

显示ct-ng的使用帮助。

1.4.2、ct-ng version

显示croostool-ng的版本信息。

1.4.3、ct-ng list-samples

列出支持的交叉编译工具链

1.4.4、ct-ng show-<samples>

显示samples的相关配置。

示例:

1.4.5、ct-ng <samples>

samples作为基准进行配置。

会在当前目录下生成.config配置文件。

我们在此基础上进行简单配置,大大简化了我们的工作。

1.4.6、ct-ng menuconfig

使用ncurses编写的界面进行配置。

示例:

1.4.7、ct-ng show-tuple

显示当前配置的是什么交叉编译工具链

示例:

1.4.8、ct-ng show-config

显示当前配置的大概信息。

示例:

1.4.9、ct-ng source

下载用到的工具。

这个放在编译之前执行,这样能防止编译过程中网络不好出现中断。

查看下载好的源码包:

1.4.10、ct-ng build

根据配置好的配置文件进行编译。

最终编译成功的产物在~/x-tools/x86_64-unknown-linux-gnu目录中。

~/x-tools/x86_64-unknown-linux-gnu/bin加入PATH环境变量中:

export PATH=~/x-tools/x86_64-unknown-linux-gnu/bin:$PATH

~/x-tools/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/sysroot用环境变量代替:

export X86_64_UNKNOWN_LINUX_GNU_SYSROOT=~/x-tools/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/sysroot
1.4.11、ct-ng list-steps

列出当前配置的编译步骤。

示例:

1.4.12、ct-ng <step>+

从某个步骤开始编译。当中途出错了之后,我们可以从断开处继续,而不必从头开始。

1.5、交叉编译器的使用案例1

使用案例:没有使用任何的编译系统(gmakeninja),直接使用交叉编译器去编译。

适用情形:学习或者是特别简单的程序。

1、编写一个简单的C源代码:

#include<stdio.h>
#include<math.h>

int main() {
    printf("PI = %f\n", 4 * atan(1.0));
    return 0;
}

2、直接使用交叉编译器进行编译:

x86_64-unknown-linux-gnu-gcc -o xx xx.c -lm
1.6、交叉编译器的使用案例2

使用案例:对只有Makefile,并且这个Makefile不需要用另外的工具 (configureautogen.shCMake)生成的C工程进行编译。

示例案例:对tree进行交叉编译。

make CC=x86_64-unknown-linux-gnu
make install DESTDIR=/home/fpliu/heros

CC用来指定交叉编译器

DESTDIR用来指定安装路径,这个默认值为/usr,这显然不符合实际情况,因为,既然是交叉编译, 就说明这个程序一定不是在当前系统中能运行的,肯定要放到另外一个平台下运行,一般的,我们要放到一个单独的文件夹中。

1.7、交叉编译器的使用案例3

使用案例:对GNU-styleC工程进行编译。

示例案例:对ncurses进行交叉编译。

./configure --host=x86_64-unknown-linux-gnu --prefix=/home/fpliu/heros
make
make install

--host用来指定交叉编译器

--prefix用来指定安装路径,这个默认值为/usr,这显然不符合实际情况,因为,既然是交叉编译, 就说明这个程序一定不是在当前系统中能运行的,肯定要放到另外一个平台下运行,一般的,我们要放到一个单独的文件夹中。