即使使用`-fPIC`编译,ICU也不能静态建立MRI

时间:2017-08-11 17:18:10

标签: c++ ruby

我一直在研究用于MRI Ruby的ICU绑定。配置在OS X中运行顺畅。但它在Travis(Ubuntu 12.04,gcc 4.8 +)上失败了。

构建文件下载,提取,编译ICU到静态库,并将我的胶水代码链接到共享对象。它应该是平滑的,但每次都会弹出链接错误。

linking shared-object icu/icu.so relocation R_X86_64_32S against `.rodata._ZL11_uErrorName' can not be used when making a shared object; recompile with -fPIC` was found

Rubygem构建配置文件: https://github.com/fantasticfears/icu4r/blob/master/ext/icu/extconf.rb#L88-L89

我已尝试使用--enable-static --disable-shared --disable-renaming,但它无法正常工作。 如果我使用--enable-static --disable-renaming构建它,但是当实际用户加载gem时,gem会失败。它甚至在我的机器中都没有用于rubygems。虽然我可以通过rake构建它。

1 个答案:

答案 0 :(得分:1)

我在icu-support邮件列表上询问并得到了Rob Boehne的回复。

  

在Ruby或Python等动态语言中,您需要一个动态库或框架才能使用ICU。这就是为什么-disable-shared不起作用的原因。   问题是一个目标文件需要-fPIC而不是-fpic,这是默认值。因此,修复是使用-enable-shared配置并将-fPIC添加到CFLAGS。

这解释了这个故事。这传递了CI,可以由包管理器rubygems分发。 我尝试构建共享但它在本地构建失败(OS X)。它可能是OS X中的LD_PATH问题。

这种变化令人讨厌,但你可能想看看。 https://github.com/fantasticfears/icu4r/commit/44403ba5d1579fbc45e6a15912a6d61e8f4eace6