2017-08-11 79 views
2

我一直工作在ICU进行MRI Ruby的绑定。配置在OS X中平稳运行,但在Travis(Ubuntu 12.04,gcc 4.8+)上失败了。ICU无法与MRI静态内置甚至它的编译`-fPIC`

构建文件下载,提取,编译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但是当实际用户加载它宝石失败。它甚至在我的机器上无法使用rubygems。虽然我可以通过rake来构建它。

回答

1

我问ICU支持邮件列表上,并得到了来自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