You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 11:22:12