收到错误“使用 -fPIC 重新编译”

收到错误“使用 -fPIC 重新编译”

在 CentOS 中的星号后./configure我输入 make 命令,但收到以下错误

/usr/bin/ld: /usr/local/lib/liblua.a(lapi.o): relocation R_X86_64_32 against `luaO_nilobject_' can not be used when making a shared object; recompile with -fPIC /usr/local/lib/liblua.a: could not read symbols: Bad value

我尝试过这个./configure CFLAGS=-fPIC但出现与上面相同的错误。

答案1

此时,在 asterisk 中,您正在尝试构建一个动态库。由于此动态库可以加载到任何内存位置,因此所有内容都需要可重定位。该-fPIC标志表示位置独立代码,代码与加载位置无关 - 可加载到任何地方。

作为此 asterisk 动态库构建的一部分,它试图引入 Lua 解释器。由于它引入的是动态库,因此需要编译 PIC 的所有内容。但您使用的是 lua 的静态库,这是不是使用 -fPIC 构建。它拒绝此操作,因为静态库中的 lua 对象无法重新定位。

顺便提一句:这就是为什么添加-fPIC到星号构建中不会有帮助的原因。不兼容的不是您的星号代码对象(-fPIC 可能会影响它),而是 liblua.a,特别是 liblua.a 所携带的对象(例如 lapi.o)。此外,您正在构建一个动态库,我相信您已经为您试图在此时整合的星号对象设置了可重定位的代码标志,例如 -fPIC。

我看到三种解决方案。

  • 一种方法是从您的构建中删除 lua。如果您不是特别需要它,并且更多地考虑“以后玩这个可能会很有趣”,那么您可以这样做,而不会失去想要的功能。

  • 另一种方法是获取 liblua 的动态版本,liblua.so您可以在 asterisk 构建中引用该版本。我不知道您的发行版,所以我不能说如何获取它。

  • 另一个更麻烦的方法是使用 -fPIC 重建 lua 和 liblua.a。您可能会遇到由于构建标志不一致(您制作的标志和磁盘上的其他标志)而导致的兼容性问题,因此我认为找到与您当前构建的 lua 相匹配的 liblua.so 是更好的选择。

如果你找到 liblua.so,你可能需要查看“-rpath”链接器标志,特别是“-Wl,-rpath,/path/to/lua/libs”

相关内容