2017-08-11 11 views
2

私はMRI RubyのICUバインディングに取り組んでいます。設定はOS Xでスムーズに実行されますが、Travis(Ubuntu 12.04とgcc 4.8+)では悲惨な結果に終わります。ICUは `-fPIC`でコンパイルされていても、MRIで静的に構築することはできません

ビルドファイルは、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が失敗します。それは私のマシンでルビー宝石のために失敗することさえあります。私はrakeによってそれを構築することができますが。

答えて

1

私はicuサポートメーリングリストで尋ねられ、Rob Boehneから返信を受けました。

RubyやPythonのような動的言語では、ICUを使用するために動的ライブラリまたはフレームワークが必要です。そのため、使用不可能な共有は機能しません。 問題は、1つのオブジェクトファイルがデフォルトの-fpicの代わりに-fPICを必要とすることです。したがって、修正は、-enable-sharedで設定し、-fPICをCFLAGSに追加することです。

これは物語を説明します。これはCIを通過し、パッケージマネージャーのrubygemsによって配布されます。 共有を構築しようとしましたが、ローカルでビルドに失敗しました(OS X)。特にOS XではLD_PATHの問題になる可能性があります。

変更は厄介ですが、一見するとよいでしょう。 https://github.com/fantasticfears/icu4r/commit/44403ba5d1579fbc45e6a15912a6d61e8f4eace6

関連する問題