簡體   English   中英

如何在沒有libiconv符號名稱的情況下在OSX上構建iconv的靜態庫?

[英]How to build a static lib of iconv on OSX without libiconv symbol names?

我正在嘗試在OSX上將gnu iconv構建為靜態庫。 這不是問題,它可以很好地構建

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

但是當我在libiconv.a上運行nm時,得到以下結果

...
_libiconv
_libiconv_open_
_libiconv_close_
...

這是有問題的,因為我想使用此庫來構建libxml2,並且它需要以下符號

iconv
iconv_open
iconv_close

瀏覽頭文件時,似乎這兩個符號名稱之間的區別在於是否定義了LIBICONV_PLUG。 但是當我運行make as

make clean && make CPPFLAGS=-DLIBICONV_PLUG

我收到錯誤消息是因為未定義一些內容,例如ICONV_GET_DISCARD_ILSEQ和ICONV_SET_HOOKS。 再次瀏覽頭文件,只有在未定義LIBICONV_PLUG的情況下才定義它們。

我的問題是,我是否正確使用LIBICONV_PLUG? 還有其他方法來獲取帶有所需符號的靜態庫嗎? 我是否應該瀏覽未定義的符號並自己手動定義它們?

有三種可能的方式來構建和使用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的README中所述,LIBICONV_PLUG標志創建一個庫,該庫將覆蓋系統中的功能。 這僅適用於GNU,Solaris和OSF / 1。

在您的情況下,您只想讓某些免費軟件包(例如libxml2)使用GNU libiconv,最簡單的方法是采用第一種方法,並且在編譯該軟件包時,請使用-I和-L選項使它找到GNU libiconv頭文件和庫。

實際上,libxml2使得此操作變得容易:它的配置腳本已經具有--with-iconv = prefix選項,通過該選項可以指定安裝GNU libiconv的目錄層次結構( 前綴 / include /中的頭文件和目標文件)在前綴 / lib /)中; 然后,配置腳本將合成適當的-I和-L選項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM