【发布时间】:2020-08-02 15:44:20
【问题描述】:
(来自 comp.lang.ada 的交叉发布)
我正在遵循 GNAT 示例中的插件方案,使用 GTK。所以我需要 gtkada,并且为了正确处理它,gtkada_contributions。我从 Adacore 站点获取了(二进制)GNAT 和 gtkada 的实际版本(2020)。我从 Dmitry 的网站获取了 gtkada_contributions 源代码。
插件方案需要构建独立的可重定位库(在运行时加载)。因此,为了制作(在 Linux 上)我从终端调用:
gtkada-env.sh
export GTKADA_BUILD=relocatable
gprbuild -Pbase
我的项目文件 base.gpr 和 gtkada_contributions_lib.gpr,这是原始项目文件,添加了以下内容:
for Library_Name use "gtkada_contributions";
for Library_Dir use "lib";
for Library_Kind use "relocatable";
上面的 gprbuild 命令现在产生:
Build Libraries
[gprlib] gtkada_contributions.lexch
[link library] libgtkada_contributions.so
/opt/GNAT/2020/bin/../libexec/gcc/x86_64-pc-linux-gnu/9.3.1/ld: /home/frank/Lib/Ada/gtkada_contributions/gdk-color-ihls.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
/opt/GNAT/2020/bin/../libexec/gcc/x86_64-pc-linux-gnu/9.3.1/ld: /home/frank/Lib/Ada/gtkada_contributions/gdk-pixbuf-image.o: relocation R_X86_64_32 against symbol `gdk__pixbuf__image__rgb_imageT' can not be used when making a shared object; recompile with -fPIC
...
还有很多其他类似的台词。
将 -fPIC 添加到 gtkada_contributions_lib.gpr(编译器开关)并没有改变任何东西,所以我猜是 gtkada 甚至 gtk 必须重新编译。独自前进可能意味着数小时的无用工作,可能会破坏我的系统。
那么我该如何编译/链接我的项目呢? 那么未来没有可重定位库的项目是否仍然可以编译和链接?
提前感谢您的任何提示。
【问题讨论】:
-
据我所知,GtkAda 分为三个版本:静态、静态图片和可重定位。问题:您确定您的编译器在编译期间没有添加任何标志 -fPIC 吗?还是 -static 标志?因为它可能正在尝试调用静态图片版本。只需运行带有标志 -vh 的 gprbuild 即可获得更多信息。
-
对于 64 位 linux,社区部分包含 gtkada 的源代码和 bin 版本。我下载了bin。它也必须包含源代码,因为我在执行安装脚本时看到了很多编译消息。除了目标目录,我不记得有人问过任何问题。
-
这很奇怪。我在 Ubuntu 上几乎相同的集合(也是 GNAT GPL 2020 和 GTKAda 2020)上测试 gtkada_contributions,一切都按预期工作。如果我没记错的话,一些发行版会将它们自己的标志添加到编译器(通过 .bashrc、环境变量等)。前段时间,Debian 或 Fedora 默认添加了 -fPIC 等。我现在不确定是哪一个。
-
在重新安装 GNAT 和 gtkada 无济于事后,我又查看了错误消息和 gtkada_contributions 目录。似乎在没有 -fPIC 的早期编译尝试中存在目标文件,并且在项目文件中插入此标志后没有发生重新编译。使用 -f 标志(强制)重新编译后,它工作了。问题已解决,感谢您分享您的意见。
标签: plugins ada gnat fpic gtkada