@fengshuo 后续:
我寻思着 ld: cannot find -lperl 的意思就是在 -L 指定的路径下找不到能链接的 libperl.so 或者 libperl.a 文件对吧,那我从 https://pkgs.org/download/libperl-dev 下载一个同版本 aarch64 架构的 libperl.a 补到 prebuilt/gcc/linux-x86/aarch64/toolchain-sunxi-glibc/toolchain/lib 应该就行了吧。(整个 R329 SDK 不存在任何 libperl.so 或 libperl.a 文件而且 make menuconfig 也找不到叫“libperl”的选项,不得已才从网上下)
不行。这回 ld 倒是找着了库,make 继续往下跑了几步之后又报错退出了:/usr/share/perl/5.26/Carp.pm panic: attempt to copy freed scalar
网上一搜,这是 perl 的老 bug 了:https://rt.cpan.org/Public/Bug/Display.html?id=72467 照着这个帖子修改了 /usr/share/perl/5.26/Carp.pm 就不会再报错了。不清楚为什么交叉编译环境里的 perl 要引用系统的 perl 模块,不过毕竟 perl 是解释型语言,这样跨架构应该问题不大。
之后再 make 又报错,说 U64 类型被定义了两遍。一遍在 out/r329-evb5/compile_dir/target/net-snmp-5.4.4/include/net-snmp/library/int64.h ,另一遍在 /usr/lib/x86_64-linux-gnu/perl/5.26/CORE/perl.h 。
这个问题也是好几年前就有人给 net-snmp 团队报告过了:https://sourceforge.net/p/net-snmp/bugs/2794/ 高版本的 net-snmp 已修复,可惜SDK里包含的版本太旧。我参考修复了这个问题的 commit 31613e 照葫芦画瓢给它修了(就是把 U64 的 typedef 去掉,其他地方的 U64 换成 struct counter64 )。
不知道是因为我这一通操作还是什么别的原因,后面 make 竟然用 /usr/bin/ld 去链接一堆很明显要走交叉编译的文件,然后告诉我它找不到各种各样的库...... 现在真的怀疑全志提供的 SDK 本来就有毛病。