lazarus的交叉编译方便好用,但可能和目标系统存在兼容问题,如要解决和目标系统的兼容问题,最好将目标系统lib的文件拷贝到交叉编译的lib,替换不兼容的文件。
拷贝要注意的几个地方:
示例里将/lib/x86_64-linux-gnu/的文件拷贝到/home/lib目录
1、lib目录so文件有很多是软连接文件,直接拷贝到交叉编译的lib,编译时会出错的。
红框就是软连接文件
拷贝要注意的几个地方:
示例里将/lib/x86_64-linux-gnu/的文件拷贝到/home/lib目录
1、lib目录so文件有很多是软连接文件,直接拷贝到交叉编译的lib,编译时会出错的。
红框就是软连接文件

在终端查看libgio-2.0.so真实文件:
ls -l libgio-2.0.so
看下图,libio-2.0.so.0显示是蓝色的,说明这个文件也是软连接,还要查看libio-2.0.so.0实际指向的文件
libgio-2.0.so -> libgio-2.0.so.0
ls -l libgio-2.0.so
这是显示为:
libgio-2.0.so.0 -> libgio-2.0.so.0.8600.0
最终确定libgio-2.0.so指向libgio-2.0.so.0.8600.0
cp libgio-2.0.so.0.8600.0 /home/lib/libgio-2.0.so
cp libgio-2.0.so.0.8600.0 /home/lib/libgio-2.0.so.0
其他软连接的文件也是用同样的方法处理。

2、libc.so需特殊处理,用打开文本编辑器打开libc.so文件:
/* GNU ld script Use the shared library, but some functions are only in the static library, so try that secondarily. */ OUTPUT_FORMAT(elf64-x86-64) GROUP ( /lib/x86_64-linux-gnu/libc.so.6 /usr/lib/x86_64-linux-gnu/libc_nonshared.a AS_NEEDED ( /lib64/ld-linux-x86-64.so.2 ) )
将
GROUP ( /lib/x86_64-linux-gnu/libc.so.6 /usr/lib/x86_64-linux-gnu/libc_nonshared.a AS_NEEDED ( /lib64/ld-linux-x86-64.so.2 ) )
改为(就是将所有目录删除)
GROUP ( libc.so.6 libc_nonshared.a AS_NEEDED ( ld-linux-x86-64.so.2 ) )
3、将/usr/lib/gcc/x86_64-linux-gnu/15/目录的crtbeginS.o/crtend.o/crtendS.o/crtbegin.o这4个文件拷贝到/homt/lib
其中/usr/lib/gcc/x86_64-linux-gnu/的15,不同系统,这个数字会有所不同,根据实际调整
4、最后,将/home/lib的文件拷贝到交叉编译lib替换(最好将旧文件全部删除)就可以。
手工拷贝软连接的工作量太大了,我写了个小工具,一键自动完成以上的工作。
如果替换后交叉编译出现类似下图的问题,说明工具链的版本和目标lib的不配套(一般是工具版本比较低),只需更新到新版本工具链后就可以正常交叉编译。


浙公网安备 33010602011771号