2016-11-07 11 views
1

私はOSXで静的ライブラリとしてgnu iconvをビルドしようとしています。これは問題ではありません、それはlibiconvシンボル名なしでOSXでiconvの静的なlibをビルドする方法は?

./configure --enable-static 
make clean && make 

と罰金構築しますが、私は使用してのlibxml2を構築したいので、私はlibiconv.aでNMを実行したときに、私は次のような結果

... 
_libiconv 
_libiconv_open_ 
_libiconv_close_ 
... 

を得るこれは、問題がありますこのライブラリは、それはヘッダファイルを通してみると、次の記号

iconv 
iconv_open 
iconv_close 

を必要とし、それはこれらの2人のシンボル名との違いのように思えるがLIBICONV_PLUGが定義されているかどうかです。私は

make clean && make CPPFLAGS=-DLIBICONV_PLUG 

ようにmakeを実行したときに、いくつかのものは、このようなICONV_GET_DISCARD_ILSEQとICONV_SET_HOOKSとして、定義されていないので、しかし、私はエラーを取得します。ヘッダーファイルをもう一度調べると、LIBICONV_PLUGが定義されていない場合にのみ定義されます。

私の質問は、LIBICONV_PLUGを正しく使用していますか?必要な記号を含む静的ライブラリを取得する他の方法はありますか?私は未定義のシンボルを通り、手で自分自身を定義するべきですか?

答えて

2

GNU libiconvをビルドして使用する方法は3つあります。 3つのケースでは、CまたはC++プログラム(ヘッダーファイル経由)で使用するために定義されたシンボルは、 'iconv_open'、 'iconv'、 'iconv_close'です。

  • 通常一つはオペレーティングシステムの標準ライブラリと衝突しないように、オブジェクト・ファイル・レベルで、それは、記号「libiconv_open」等を定義することです。 Cレベルのシンボルとオブジェクトファイルレベルのシンボルのマッピングは、<iconv.h>で発生します。

    システムの<iconv.h>をGNU libiconv。{so、dylib、a}(またはその逆)と使用すると、リンクエラーが発生します。これは機能です(OS X libiconv.dylibは "UTF-8-MAC"という名前のエンコーディングをサポートしていますが、GNU libiconvにはいくつかの改善点と修正点があります)、不一致がトラブルにつながる可能性があるためです。

  • システムベンダーの方は、「libiconv_open」ではなく「iconv_open」などを定義するようにGNU libiconvをビルドすることができます。これはiconv.hの簡単な編集によって実現されます。

    特に、OS Xでは、libiconvをhttps://opensource.apple.com/から選んでコンパイルすることができます。しかし、このバージョンはGNU libiconv 1.11に基づいていることに注意してください。つまり、かなり古くなっています。

  • LIBICONV_PLUGフラグは、GNU libiconvのREADMEで説明したように、システム内の機能をオーバーライドするライブラリを作成します。これはGNU、Solaris、およびOSF/1でのみ動作します。あなただけのGNUは、いくつかのフリーソフトウェアパッケージ(などのlibxml2など)で使用されるlibiconvを持つようにしたいあなたのケースでは、

は、最も簡単な方法は、最初のアプローチを取ることで、そのパッケージ、使用のコンパイル時GNU libiconvヘッダファイルとライブラリを見つけるための-Iオプションと-Lオプション実際に

、libxml2のは、これは簡単です:そのconfigureスクリプトは、すでに--with-iconvのオプション=あなたはGNUのlibiconvを(接頭辞でヘッダファイルをインストールしたディレクトリ階層を指定し、それを通して接頭を、持っています/include /オブジェクトファイルプレフィックス/lib /); configureスクリプトは適切な-Iと-Lオプションを合成します。

+0

この有益かつ徹底的な答えに非常に親切に感謝します! – Sossisos

関連する問題