我正在尝试从 Giraffe Library 网站编译 GTK 3 Hello World 示例。
我从源安装了 Poly/ML 5.9.1,为 Poly 可执行文件设置了 PATH,为库设置了 LD_LIBRARY_PATH。另外,PKG_CONFIG_PATH 以便 Makefile 可以找到
polyml.pc
。
现在我明白了
$ 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 5.9。
这里我从源代码安装了Poly/ML 5.9,然后重新编译了Giraffe Library,然后我就可以编译Hello World示例了。
Giraffe Library 提供的示例不需要为 Poly/ML 设置 PATH、LD_LIBRARY_PATH 或 PKG_CONFIG_PATH。 示例 Makefile 包括
${GIRAFFEHOME}/config.mk
,它存储安装 Giraffe Library 时找到的 Poly/ML 安装。 (在上面的记录中,可以看到 LD_LIBRARY_PATH 和 PKG_CONFIG_PATH 是在 Makefile 生成的构建命令中本地设置的。)
从构建命令中,我可以看到 Giraffe Library 正在使用安装在
/usr
下的 Poly/ML。 我怀疑这不是您从源代码构建的版本(/usr
对于手动构建的版本来说不是一个好的前缀),而是包管理系统提供的版本。 您需要重新安装 Giraffe Library 并指定特定的 Poly/ML 前缀,例如
./configure --polyml-prefix <polyml-installation-dir>
make
make install
我怀疑你让它工作不是因为你使用了 Poly/ML 5.9,而是因为你重新安装了 Giraffe Library,它选择了 5.9 版本而不是系统版本。
您的应用程序的 Makefile 不需要使用
${GIRAFFEHOME}/config.mk
。 相反,您可能要求构建环境具有合适的 PATH、LD_LIBRARY_PATH 和 PKG_CONFIG_PATH 值。