最近在公司用龙芯笔记本跑项目,发现和平时在x86上写代码有点不一样。最开始几个依赖死活编译不过,折腾了一整天才理顺流程。现在把踩过的坑和经验记下来,方便后面的人少走弯路。
环境准备别跳步
龙芯平台目前主流是LoongArch架构,系统多用统信UOS或中科方德,也有开发者装Loongnix。不管哪种,第一步都是确认系统版本和架构:
uname -a
lsb_release -a
看到输出里有 loongarch64 就对了。接下来装编译工具链,GCC、Make、Autoconf这些一个都不能少。可以直接用系统源安装:
sudo apt update
sudo apt install build-essential gcc make autoconf automake libtool
源码编译常见问题
从GitHub拉下来的开源项目,很多默认只测试x86和ARM。直接在龙芯上make,经常报错说不支持的指令集。这时候别急着换机器,先看报错信息是不是出在内联汇编或者SIMD优化部分。
比如遇到某个库因为用了__builtin_popcountll导致编译失败,可以尝试加宏定义绕过:
CPPFLAGS="-D__builtin_popcountll=popcountll_fallback" ./configure
make
有些项目需要打补丁才能顺利编译,建议去项目的Issues里搜一下loongarch关键词,往往已经有热心人提交了解决方案。
交叉编译也是一种选择
如果你在x86开发机上写代码,但目标运行环境是龙芯,可以用交叉编译工具链。LoongArch官方提供了gcc-cross工具链包,安装后就能生成loongarch64可执行文件。
设置交叉编译环境变量:
export CC=loongarch64-unknown-linux-gnu-gcc
export CXX=loongarch64-unknown-linux-gnu-g++
./configure --host=loongarch64-unknown-linux-gnu
make
这种方式适合做持续集成,也方便快速打包测试。
调试别忘了gdb
编译成功不代表万事大吉。运行时报段错误也很常见。龙芯平台上的gdb使用方式和x86基本一致,但要注意符号表是否完整加载。
启动调试:
gdb ./myapp
(gdb) run
(gdb) bt
如果堆栈显示不全,检查编译时有没有加-g选项。另外,静态链接的程序在龙芯上更容易排查问题,动态库路径错乱的情况少一些。
实际工作中,我遇到过一个日志组件在其他平台正常,到了龙芯上疯狂打印警告。最后发现是时间戳函数调用了未对齐的内存访问,加上编译选项-mno-strict-align就解决了。
打包发布小技巧
软件编译好了,怎么交给别人用?建议用checkinstall代替直接make install,这样能生成deb包,方便管理和卸载。
sudo checkinstall make install
如果是团队内部共享,可以把常用依赖提前做成私有源,新人入职一条命令就能拉齐环境,省得一个个编译耗时间。