虽然QFLazarus等安装工具自带交叉编译的lib文件,但linux交叉编译出来的程序可能和目标linux存在兼容问题或交叉编译问题,如遇到这类问题最好的解决方法是从目标系统拷贝lib文件替换原来的lib文件。
比如今天我交叉编译QFLazarus-QT5时遇到许多未定义的引用,最后还是要从目标系统拷贝lib后解决:
比如今天我交叉编译QFLazarus-QT5时遇到许多未定义的引用,最后还是要从目标系统拷贝lib后解决:
D:\QFLazarus4.4\cross\bin-x86_64-win64\riscv64-linux\riscv64-linux-gnu-ld.exe: D:\QFLazarus4.4\cross\lib\riscv64-linux\/libQt5Pas.so: undefined reference to `QLocale::toLower(QString const&) const@Qt_5' D:\QFLazarus4.4\cross\bin-x86_64-win64\riscv64-linux\riscv64-linux-gnu-ld.exe: D:\QFLazarus4.4\cross\lib\riscv64-linux\/libQt5Pas.so: undefined reference to `QClipboard::pixmap(QClipboard::Mode) const@Qt_5' D:\QFLazarus4.4\cross\bin-x86_64-win64\riscv64-linux\riscv64-linux-gnu-ld.exe: D:\QFLazarus4.4\cross\lib\riscv64-linux\/libQt5Pas.so: undefined reference to `QScrollPrepareEvent::startPos() const@Qt_5' D:\QFLazarus4.4\cross\bin-x86_64-win64\riscv64-linux\riscv64-linux-gnu-ld.exe: D:\QFLazarus4.4\cross\lib\riscv64-linux\/libQt5Pas.so: undefined reference to `QTextInlineObject::format() const@Qt_5' D:\QFLazarus4.4\cross\bin-x86_64-win64\riscv64-linux\riscv64-linux-gnu-ld.exe: D:\QFLazarus4.4\cross\lib\riscv64-linux\/libQt5Pas.so: undefined reference to `QWidget::releaseKeyboard()@Qt_5' D:\QFLazarus4.4\cross\bin-x86_64-win64\riscv64-linux\riscv64-linux-gnu-ld.exe: D:\QFLazarus4.4\cross\lib\riscv64-linux\/libQt5Pas.so: undefined reference to `QFont::setKerning(bool)@Qt_5' D:\QFLazarus4.4\cross\bin-x86_64-win64\riscv64-linux\riscv64-linux-gnu-ld.exe: D:\QFLazarus4.4\cross\lib\riscv64-linux\/libQt5Pas.so: undefined reference to `QTextCursor::selectedTableCells(int*, int*, int*, int*) const@Qt_5' D:\QFLazarus4.4\cross\bin-x86_64-win64\riscv64-linux\riscv64-linux-gnu-ld.exe: D:\QFLazarus4.4\cross\lib\riscv64-linux\/libQt5Pas.so: undefined reference to `QLineEdit::paste()@Qt_5' D:\QFLazarus4.4\cross\bin-x86_64-win64\riscv64-linux\riscv64-linux-gnu-ld.exe: D:\QFLazarus4.4\cross\lib\riscv64-linux\/libQt5Pas.so: undefined reference to `QTransform::map(QLine const&) const@Qt_5' D:\QFLazarus4.4\cross\bin-x86_64-win64\riscv64-linux\riscv64-linux-gnu-ld.exe: D:\QFLazarus4.4\cross\lib\riscv64-linux\/libQt5Pas.so: undefined reference to `QTextDocument::setDefaultFont(QFont const&)@Qt_5' D:\QFLazarus4.4\cross\bin-x86_64-win64\riscv64-linux\riscv64-linux-gnu-ld.exe: D:\QFLazarus4.4\cross\lib\riscv64-linux\/libQt5Pas.so: undefined reference to `QStyleOptionSpinBox::QStyleOptionSpinBox()@Qt_5' D:\QFLazarus4.4\cross\bin-x86_64-win64\riscv64-linux\riscv64-linux-gnu-ld.exe: D:\QFLazarus4.4\cross\lib\riscv64-linux\/libQt5Pas.so: undefined reference to `QChar::toLower(unsigned int)@Qt_5' D:\QFLazarus4.4\cross\bin-x86_64-win64\riscv64-linux\riscv64-linux-gnu-ld.exe: D:\QFLazarus4.4\cross\lib\riscv64-linux\/libQt5Pas.so: undefined reference to `QItemSelectionModel::columnIntersectsSelection(int, QModelIndex const&) const@Qt_5'
要解决这类问题,只需:
1、将目标linux的/usr/lib/x86_64-linux-gnu下的文件拷贝出来,替换windows相应的lib就可以。
2、但lib里存在大量的软链接文件,需将软链接文件指向的真实文件拷贝并改为软链接文件的文件名称
由于存在大量软链接文件,逐一人工处理效果很低且容易出错:
建议用以下方法处理:
1)先判断要拷贝的文件是否为软链接文件
if fpS_ISLNK(Info.st_mode) then // 使用 fpS_ISLNK 宏判断是否为符号链接beginRealFile:= fpReadLink(fn) ;//返回链接指向的真正文件名称end;
2)拷贝时源文件用返回的真正文件名称
CopyFile(RealFile,filename,[cffOverwriteFile, cffCreateDestDirectory,cffPreserveTime]);
3、修改libc.so文件,用文本编辑器打开libc.so,会看到类似以下的信息:
/* GNU ld scriptUse the shared library, but some functions are only inthe 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 ) ) 这行里的路径全部删除,只保留文件名称:
/* GNU ld scriptUse the shared library, but some functions are only inthe static library, so try that secondarily. */ OUTPUT_FORMAT(elf64-x86-64) GROUP ( libc.so.6 libc_nonshared.a AS_NEEDED ( ld-linux-x86-64.so.2 ) )
4、从/usr/lib/gcc/x86_64-linux-gnu/15目录拷贝以下4个关键的o文件,其中x86_64-linux-gnu/15根据实际的情况确定。
crtbeginS.o
crtend.o
crtendS.o
crtbegin.o
为方便使用,我写了个小工具,专门拷贝lib的文件,并已自动处理了
下载地址:
http://sgamer.oicp.net:8888/copylibfile.7z
