如何避免在嵌入式Linux手动交叉编译开源软件时遇到常见问题?

摘要:该文章主要提到了一些常见的编译错误及其解决方案,并提供了一些最佳实践,帮助开发者避免编译过程中的陷阱。通过这些建议,读者能够更高效地进行嵌入式Linux开发,减少编译和调试的时间。
在嵌入式Linux的开发过程中,我们经常需要用到一些软件库或者是测试工具,这些库和工具大概率都是x86平台上开发的,就需要我们通过对源码进行交叉编译,生成能够在开发板上使用的软件和动态库。 对于某些开源软件进行编译有两种情况,第一种是如果我们使用buildroot根文件系统,可以在buildroot的menuconfig编译菜单中,勾选相应的软件,重新编译根文件系统,编译完成之后该根文件系统就会自动带上对应的库和可执行程序,第二种是buildroot中无法找到我们需要的软件,这种情况下,只能够进行手动交叉编译,接下具体讲解下手动交叉编译开源软件可能遇到的一些问题 一、使用交叉编译工具链时常见问题 1.1 编译过程中头文件相关问题 交叉编译时我们可能会遇到找不到头文件的问题,我们都知道在x86平台上开发程序,程序中通过尖括号的方式包含头文件:#include <xxx.h>他会到系统目录下去查找所需要的头文件,一般情况在/usr/include或者/usr/local/include路径下,那么对于我们的交叉编译工具的系统目录又是哪里呢,我们可以通过以下命令来查看当前交叉编译工具对应的include系统路径在哪 echo 'main(){}' | <交叉编译工具> -E -v - 这个命令利用 gcc 的预处理(-E)和详细输出(-v)功能,帮助查看编译器查找头文件和库文件的路径。适用于调试和理解交叉编译器的工作原理,尤其是在处理不同平台和工具链时。下面在我的平台中举例,我使用rk3576的SDK中自带的交叉编译工具,执行如上命令之后,输出结果如下图所示 可以看见,该命令将#include ""和#include <>会查找的路径都打印了出来,对于源文件中通过#include ""的头文件,该编译器会到源文件当前路径下查找,对与原文件中通过#include <>的头文件,aarch64-none-linux-gnuu-gcc编译器会去以下三个路径中去查找,而不是x86平台下的系统路径中去查找。如果在我们交叉编译过程中,缺少某些头文件,我们就可以把对应头文件拷贝到这些目录中去,放到任意一个路径下就行。 /home/wzy/sdk/rk3576_linux6.1.99_release-rkr5/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/../lib/gcc/aarch64-none-linux-gnu/10.3.1/include /home/wzy/sdk/rk3576_linux6.1.99_release-rkr5/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/../lib/gcc/aarch64-none-linux-gnu/10.3.1/include-fixed /home/wzy/sdk/rk3576_linux6.1.99_release-rkr5/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/../lib/gcc/aarch64-none-linux-gnu/10.3.1/../../../../aarch64-none-linux-gnu/inclu de 除了上面这种方法,也可以直接在编译源文件的时候在后面加上-v选项查看详细的编译信息,例如我这里编译一个usb相关的应用程序,下面是我执行交叉编译的命令,后面加上了-v来显示具体的编译信息 /home/wzy/sdk/rk3576_linux6.1.99_release-rkr5/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc usb1.c -o usb1 -v 执行结果如下 这里可以看见上面所讲的交叉编译工具的头文件系统路径,同时也报出一个错误,无法找到libusb.h文件,因为我没有吧对应头文件拷贝到红框中的任何一个头文件路径中去,也没有通过-I命令手动指定。接下来我将通过手动指定的方式来展示加了这个选项之后的变化。 上面提到了除了使用系统目录外,也可以自己指定目录:编译时用-I<path>选项指定。
阅读全文