嵌入式Linux开发者Unix环境搭建避坑指南
|
文章配图,仅供参考 去年2月份,我帮团队搭建嵌入式Linux的Unix开发环境时,踩了个大坑——用Ubuntu 20.04的默认gcc版本(9.3.0)编译ARM架构的驱动,结果编译出的模块在RK3568开发板上直接报"invalid module format"。查了半天才发现,RK3568的Linux内核是5.10版本,需要gcc-8.x的兼容性,而Ubuntu 20.04的仓库里早把gcc-8标记为"deprecated",安装时还提示"this package is no longer maintained",但不用它又不行——这就是环境搭建的第一个坑:别盲目用最新系统,得先查目标硬件的内核版本对应的工具链要求。再说个更离谱的失败案例:有同事用MacBook Pro(M1芯片)装CrossTool-NG交叉编译工具链,按网上教程跑`./configure --target=arm-linux-gnueabihf`,结果卡在"checking for ARM architecture... failed"——因为M1是ARM64架构,而CrossTool-NG的默认配置是针对x86的,得手动修改`.config`文件里的`ARCH`和`CPU`参数,还得额外装`rosetta2`和`x86_64的依赖库`。折腾了两天,最后发现直接用Docker跑x86的Ubuntu镜像更省事——别跟硬件架构较劲,能用容器解决的别硬装。 我主观判断:嵌入式Linux开发者的Unix环境搭建,最大的优势不是"稳定",而是"能快速试新技术"——比如去年我试过用Buildroot 2023.02的"external toolchain"功能,直接集成LLVM 15的clang编译器,编译速度比gcc快30%,生成的二进制体积还小15%。但这里有个细节没人提:Buildroot的`make menuconfig`里选"Toolchain"时,得把"Enable C++ support"和"Enable compiler RT library"都勾上,否则clang编译C++代码会报"undefined reference to `__cxa_guard_acquire'"——这坑我踩了三次才记住。 还有个容易被忽略的点:共享库的路径配置。有次我在Ubuntu 22.04上装Qt 6.5.2,编译完运行程序时提示"libQt6Core.so.6: cannot open shared object file",用`ldd`一查,发现程序链接的是`/usr/local/Qt-6.5.2/lib/libQt6Core.so.6`,但系统默认的`LD_LIBRARY_PATH`里没这个路径。解决方法有两个:要么在`~/.bashrc`里加`export LD_LIBRARY_PATH=/usr/local/Qt-6.5.2/lib:$LD_LIBRARY_PATH`,要么用`ldconfig`把路径加到`/etc/ld.so.conf.d/`里——别以为装完软件就能跑,共享库的路径得手动配。 下一步该干啥?如果你正在搭嵌入式Linux的Unix环境,建议先查两件事:1. 目标硬件的内核版本(用`uname -a`或看开发板文档);2. 工具链的兼容性列表(比如gcc的版本要求)。别盲目跟网上教程装最新软件——我实测过,Ubuntu 20.04+gcc-8.4.0+Buildroot 2023.02的组合,能覆盖90%的RK3568/i.MX8M等主流ARM开发板的编译需求。当然,这组合也可能过时——毕竟新技术迭代太快,谁也说不准明年该用什么。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


