Ubuntu 22.04编译Giraffe库GTK3 Hello World遇链接错误求助
我尝试编译Giraffe Library官网的GTK 3 Hello World示例。已从源码安装Poly/ML 5.9.1,配置了PATH、LD_LIBRARY_PATH和PKG_CONFIG_PATH以确保Makefile能找到polyml.pc。执行make polyml时出现如下链接错误:
$ make polyml LD_LIBRARY_PATH=/home/gergely/giraffe/lib/polyml:/usr/lib:/home/gergely/local/lib:/usr/lib/x86_64-linux-gnu: \ GIRAFFE_SML_LIB=/home/gergely/giraffe/lib/sml \ GIRAFFE_DEBUG=1 \ /usr/bin/poly --use make-polyml-libs.sml -q echo "PolyML.export (\"example-1-polyml.o\", main);" > polyml-export.sml LD_LIBRARY_PATH=/home/gergely/giraffe/lib/polyml:/usr/lib:/home/gergely/local/lib:/usr/lib/x86_64-linux-gnu: \ GIRAFFE_SML_LIB=/home/gergely/giraffe/lib/sml \ GIRAFFE_DEBUG=1 \ /usr/bin/poly --use make-polyml-app.sml -q cc \ -g \ -rdynamic \ -Wl,--no-copy-dt-needed-entries \ -Wl,-rpath,/usr/lib \ -Wl,-rpath,/home/gergely/giraffe/lib/polyml \ -o example-1-polyml \ example-1-polyml.o \ -L/home/gergely/giraffe/lib/polyml -lgiraffe-gobject-2.0 -lgiraffe-gio-2.0 -lgiraffe-gtk-3.0 \ `PKG_CONFIG_PATH=/usr/lib/pkgconfig:/home/gergely/local/lib/pkgconfig:/usr/lib/x86_64-linux-gnu pkg-config --libs polyml gobject-2.0 gio-2.0 gio-unix-2.0 gtk+-3.0` /usr/bin/ld: example-1-polyml.o: warning: relocation in read-only section `.text' /usr/bin/ld: example-1-polyml.o:(.data+0x50): undefined reference to `PolyFFIGeneral' /usr/bin/ld: example-1-polyml.o:(.data+0x230): undefined reference to `PolyTimingGeneral' /usr/bin/ld: example-1-polyml.o:(.data+0x410): undefined reference to `PolyFFIGeneral' /usr/bin/ld: warning: creating DT_TEXTREL in a PIE collect2: error: ld returned 1 exit status make: *** [Makefile:210: example-1-polyml] Error 1
请问如何在Ubuntu 22.04上成功编译该程序?
这些未定义引用错误源于链接器无法找到Poly/ML核心库或链接顺序错误,可按以下步骤修复:
验证pkg-config的Poly/ML输出
手动执行以下命令,确认是否返回正确的Poly/ML链接参数:PKG_CONFIG_PATH=/usr/lib/pkgconfig:/home/gergely/local/lib/pkgconfig:/usr/lib/x86_64-linux-gnu pkg-config --libs polyml正常输出应包含
-L<Poly/ML库路径> -lpolyml,若没有,说明polyml.pc路径配置错误或文件内容异常。调整链接顺序
修改Makefile中的链接命令,将Poly/ML的库参数(通过pkg-config输出的内容)移到example-1-polyml.o之后、Giraffe库之前。链接器按顺序解析依赖,确保依赖库出现在被依赖对象之后。手动指定Poly/ML库路径
如果pkg-config未正确返回库路径,直接在链接命令中添加-L/home/gergely/local/lib(替换为你的Poly/ML实际lib路径)和-lpolyml,放在Giraffe库参数之后。禁用PIE编译
Ubuntu 22.04默认启用PIE,与Poly/ML的编译方式可能冲突。在链接命令的cc参数中加入-no-pie,修改后的命令片段如下:cc \ -g \ -rdynamic \ -no-pie \ -Wl,--no-copy-dt-needed-entries \ -Wl,-rpath,/usr/lib \ -Wl,-rpath,/home/gergely/giraffe/lib/polyml \ -o example-1-polyml \ example-1-polyml.o \ ...(其余参数不变)重新编译Poly/ML
若上述步骤无效,重新从源码编译Poly/ML:./configure --prefix=/home/gergely/local make && make install确保
polyml.pc文件生成在/home/gergely/local/lib/pkgconfig目录下,且PKG_CONFIG_PATH包含该路径。
内容的提问来源于stack exchange,提问作者Gergely

