2016-11-07 33 views
1

我試圖在OSX上建立gnu iconv作爲靜態庫。這不是一個問題,它建立罰款如何在沒有libiconv符號名稱的OSX上構建iconv的靜態庫?

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

,但是當我在libiconv.a運行處,我得到下面的結果

... 
_libiconv 
_libiconv_open_ 
_libiconv_close_ 
... 

這是有問題的,因爲我想用建立的libxml2這個庫,它需要以下符號

iconv 
iconv_open 
iconv_close 

通過頭文件看,好像這兩個符號名稱之間的區別是LIBICONV_PLUG是否定義。但是,當我運行作出

make clean && make CPPFLAGS=-DLIBICONV_PLUG 

我得到的錯誤,因爲一些事情沒有定義,如ICONV_GET_DISCARD_ILSEQ和ICONV_SET_HOOKS。再次查看頭文件,只有在未定義LIBICONV_PLUG時纔會定義這些文件。

我的問題是,我正確使用LIBICONV_PLUG?有沒有其他的方式來獲得我需要的符號靜態庫?我是否應該通過未定義的符號並親自定義它們?

回答

2

有三種可能的方式來構建和使用GNU libiconv。 在所有這三種情況下,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有許多改進和修復),不匹配會導致麻煩。

  • 如果您是系統供應商,您可以通過定義'iconv_open'而不是'libiconv_open'等來構建GNU libiconv,這可以通過簡單編輯iconv.h來實現。

    或者,特別是在OS X上,您可以從https://opensource.apple.com/中選擇libiconv並自行編譯它。但請注意,這個版本是基於GNU libiconv 1.11的,也就是說,它已經很老了。

  • 正如在GNU libiconv的自述文件中所解釋的,LIBICONV_PLUG標誌創建了一個將覆蓋系統功能的庫;這僅適用於GNU,Solaris和OSF/1。

在你的情況,你只希望有GNU libiconv的一些免費的軟件包(如libxml2的)中使用,最簡單的方法是採取第一種方法,而該包,使用編譯期間-I和-L選項使它找到GNU libiconv頭文件和庫。

事實上,libxml2的讓一切變得簡單:它的配置腳本已--with-的iconv選項= 前綴,通過它您可以指定您已在前綴安裝GNU libiconv的(頭文件的目錄層次結構/include /和目標文件前綴/lib /);配置腳本將會合成相應的-I和-L選項。

+0

非常感謝您提供豐富翔實的答案! – Sossisos

相關問題