gpt4 book ai didi

gcc - 为什么 gcc 在 x86_64 上编译静态库时不隐式提供 -fPIcflags

转载 作者:行者123 更新时间:2023-12-03 05:42:58 26 4
gpt4 key购买 nike

我在编译静态链接到静态库的共享对象时遇到了很多问题。此问题仅出现在 x84_64 平台上。在 x86_32 上执行相同的编译工作时,我没有任何问题。

也许这是操作系统特定的 GCC 配置,但我的研究表明这是 GCC 在 x86_64 平台上的工作方式。无论如何,我在 Ubuntu 10.04 x86_64 上使用 gcc 4.4.3。

问题如何解决?...确保所有静态库依赖项都使用 -fPIC 进行编译。

问题 1: -fpic 和 -fPIC 之间有什么区别(显然 -fPIC 在 x86 上生成更多指令)?为什么后面的类型在 x86_64 上下文中更相关?

问题 2: 我的假设是,当您链接静态代码时,您在链接时将函数硬连接到二进制文件中,为什么它需要“位置无关代码”的间接级别“机械提供?

问题 3: 现在,如果 x86 不需要 -fpic/-fPIC 来将共享对象链接到静态存档,为什么 x86_64 中需要它?

问题 4:即使需要,为什么不隐式提供?我认为重大变更应该是一个大禁忌

最佳答案

  1. 查看问题 3544035 。还讨论了herethere .
  2. 这取决于您的静态库的用途。如果您只想将其链接到程序中,则不需要 PIC 代码(libtool 称其为便利库,因为您几乎可以不用它,例如,它只是帮助您的编译过程达到合理的大小)。否则,如果您打算链接共享库,则静态库中需要 PIC 代码。
  3. 查看问题 3146744还有here
  4. 它会使你的代码变得臃肿,所以它不是默认的。需要注意的一件事是,当您编译单个目标文件时,GCC 不知道您是否要从中创建共享库。例如,在我的大多数小型项目中,我只是将几个目标文件链接在一起,不需要 PIC 代码。

另外,我的建议是:如果您需要担心这一点,那么您就做错了(或者您喜欢通过艰苦的方式学习,这很好,因为您会从经验中获得更多)。编译系统(libtool、cmake,无论你使用什么)应该为你做到这一点。

关于gcc - 为什么 gcc 在 x86_64 上编译静态库时不隐式提供 -fPIcflags,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3961446/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com