【问题标题】:gtkada: recompile with -fPICgtkada:使用 -fPIC 重新编译
【发布时间】: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


【解决方案1】:

终于明白了。在将 -fPIC 开关添加到项目文件后,似乎没有重新编译 gtkada_contributions。在 gprbuild 命令中包含 -f 标志(强制)后,所有内容都编译没有错误。

【讨论】:

    猜你喜欢
    • 2013-08-25
    • 2016-09-12
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    相关资源
    最近更新 更多