出现错误“使用 -fPIC 重新编译”

Bil*_*lal 4 linux asterisk

之后./configure星号在CentOS的I型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
Run Code Online (Sandbox Code Playgroud)

我试过这个,./configure CFLAGS=-fPIC但得到与上面相同的错误。

Ric*_*lka 5

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

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

顺便说一句:这就是为什么添加-fPIC星号构建无济于事。不兼容的不是您的星号代码对象(-fPIC 可以影响),而是 liblua.a,特别是 liblua.a 携带的对象(例如 lapi.o)。此外,此时您正在构建一个动态库,并且我确定您已经具有可重定位的代码标志,例如 -fPIC 用于您此时尝试合并的星号对象。

我看到了三种解决方案。

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

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

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

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