libxml2剖析(2):編譯

1、Linux/Unix下的編譯
    內容整理自http://xmlsoft.org/FAQ.html中一些部分。

    跟大多數UNIX庫一樣,libxml2的編譯遵循以下“標準”:

  1. gunzip -c xxx.tar.gz | tar xvf -  (或者tar xzvf libxml2-xxxx.tar.gz)  
  2. cd libxml2-xxxx  
  3. ./configure --help  
    查看各選項,然後編譯並安裝。
  1. ./configure [possible options]  
  2. make  
  3. make install  
    安裝後有可能還要重新運行ldconfig或類似工具以更新被安裝的共享庫列表。
    編譯時Libxml2無需任何其他的庫,正常的C ANSI API就足夠了。然而在配置時如果libxml2檢測到以下庫將會使用它們:
    libz: 一個高可移植的、使用廣泛的壓縮庫。
    iconv: 一個強大的字符編碼轉換庫。缺省情況下它已經被包含到當前的glibc庫中,因此在Linux上並不需要另外再安裝。關於libiconv庫,參見http://www.gnu.org/software/libiconv/。
    安裝好之後,應用程序在進行編譯和鏈接時需要知道libxml2的頭文件和庫文件位置。在上面運行./configure之後會生成一個小的Shell腳本xml2-config,它會被安裝成爲libxml2的一部分。用這個腳本可以獲得需要的編譯和鏈接標誌。
    xml2-config --cflags: 打印預處理和編譯標誌,通常是"-I/usr/local/include/libxml2"。
    xml2-config --libs: 打印庫鏈接信息,通常是"-L/usr/local/lib -lxml2 -lm -ldl"。
    在Makefile中通常是直接如下設置:
CFLAGS=`xml2-config --cflags`
LIBS=`xml2-config --libs`
    若要安裝到自己指定的目錄下,則在配置時使用"--prefix"開關,例如./configure --prefix /home/user/myxml/xmlinst {other configuration options},然後運行make和make install,libxml2庫文件、頭文件和二進制文件會安裝到/home/user/myxml/xmlinst目錄下,包括/home/user/myxml/xmlinst/lib,/home/user/myxml/xmlinst/include和/home/user/myxml/xmlinst/bin。爲了使用這個“私有”庫,你應該先把路徑添加到PATH中,export PATH=/home/user/myxml/xmlinst/bin:$PATH。
    現在假設你有一個test.c程序,編譯命令爲:gcc `xml2-config --cflags --libs` -o test test.c。注意因爲/home/user/myxml/xmlinst/bin被添加到了PATH,因此可以找得到xml2-config程序並運行它。
    2、Windows下的編譯
    (1)編譯libxml2

    若要在Windows下自行編譯libxml2,libxml2-2.9.0\win32\Readme.txt中說明怎樣通過命令行來編譯,win32\VC10\下有Visual Studio 2010工程文件,可通過VS 2010來編譯。下面介紹使用命令行的方式編譯。
    第一步:配置源代碼
    打開Visual Studio命令提示符,切換到libxml2-2.9.0\win32\下,運行cscript configure.js help,我們可以獲得詳細的配置選項幫助,包括XML處理器和Win32構建兩大類選項。我們做以下配置:
    cscript configure.js iso8859x=yes iconv=no compiler=msvc cruntime=/MT debug=no prefix=c:\libxml2
    這個配置的意思是激活libxml2庫的ISO8859X支持、不依賴於iconv庫;使用MSVC編譯器(缺省值)、C運行庫鏈接選項爲/MT、編譯成Release版本(缺省值)、編譯出來的庫、頭文件和相關工具安裝到c:\libxml2下。
    鏈接選項/MT表示靜態鏈接多線程版的C運行時函數庫(libcmt.lib),編譯器自動定義_MT宏。這樣生成的程序不會依賴於動態庫msvcrt.dll。另外/MD是動態鏈接多線程版本的C運行時庫(msvcrt.dll,導入庫爲msvcrt.lib),編譯器自動定義_MT和_DLL兩個宏。/ML是靜態鏈接單線程版本的C運行時庫(libc.lib)。而/MTd, /MDd, /MLd選項使用對應調試版的C運行時庫(libcmtd.lib, msvcrtd.dll, libcd.lib),編譯器自動再多定義一個_DEBUG宏。它們包含了調試信息,並採用了一些保護機制以幫助發現錯誤,加強了對錯誤的檢測,因此在運行性能方面比不上Release版本。
    第二步:編譯
    nmake /f Makefile.msvc
    第三步:安裝
    nmake /f Makefile.msvc install
    大功告成,在c:\libxml2下得到我們需要的libxml2庫及相關測試工具。bin\下有動態庫libxml2.dll及相關工具,lib\下有導入庫libxml2.lib,及靜態庫版本libxml2_a.lib,include\下有導出的所有頭文件。這個libxml2.dll不依賴於iconv和zlib(缺省配置是不使用zlib的),也不依賴於C運行庫msvcrt.dll。
    Libxml2中默認的內碼是UTF-8,所有使用libxml2處理的xml文件,必須首先顯式或者默認的轉換爲UTF-8編碼才能被處理。libxml2通常使用iconv庫來進行各種編碼的轉換。這對於多國語言的xml解析至關重要,例如處理中文文檔。
    Libiconv是GNU的字符編碼轉換庫,使用LGPL許可,我們需要把它編譯成動態鏈接庫。當然我們也可以用其他的字符編碼轉換庫,比如著名的ICU庫(International Component for Unicode)。ICU是一個成熟的、廣泛應用的庫,是IBM與開源組織合作研究,基於"IBM公共許可證"的用於支持軟件國際化的開源項目。ICU實現了對數字、日期、貨幣等設置的國際化支持,提供了強大的BIDI算法,對阿拉伯語和希伯來語等BiDi語言提供了完善的支持。ICU分爲ICU4J和ICU4C,分別對應Java和C/C++平臺。這個庫是在一種無限制的開放源碼許可證下發布的,這使它可以用在各種商業程序、開源程序中。詳細可參考官網http://site.icu-project.org/。
    ICU庫比較大,binary就有幾十MB以上。一般使用libiconv就足夠了,這也是libxml2缺省使用編碼轉換庫。在編譯libxml2時缺省是會鏈接到iconv庫的,我們上面選擇的是不鏈接。最好把libxml2和libiconv編譯成兩個獨立的庫,這樣就不會有依賴。
    如果選擇鏈接iconv,可以先編譯好libiconv庫(參看下面介紹),把libiconv-2.dll、導出庫iconv.lib和iconv.h拷貝到libxml2-2.9.0\win32\下(或者在配置時指定搜索路徑以找到這些文件),然後做如下配置:
    cscript configure.js iso8859x=yes compiler=msvc cruntime=/MT debug=no prefix=c:\libxml2
    這裏表示編譯時鏈接到iconv庫。注意libxml2鏈接時搜索的庫名爲iconv.lib,要確保導入庫的名稱爲iconv.lib,不是的話要改成這個名。編譯好之後libxml2.dll依賴於libiconv-2.dll,因此兩者需要一起發佈。
    (2)編譯libiconv
    根據官方http://www.gnu.org/software/libiconv/的描述,libiconv和libcharset庫以及它們的頭文件使用LGPL授權,而iconv程序使用GPL授權,我們只編譯libiconv動態庫(如果你的應用有閉源需求的話,不能使用GPL的代碼)。
    從ftp://ftp.gnu.org/gnu/libiconv/下載最新的libiconv-1.14.tar.gz,新版libiconv已經不提供用Visual Studio的nmake來編譯的腳本了,只能用Cygwin、MinGW之類的環境進行編譯,參看README.woe32的描述。我們使用MinGW環境來編譯,先安裝MinGW(http://www.mingw.org/)到C:\MinGW。在libiconv-1.14中,lib\和libcharset\下是libiconv和libcharset庫的源碼,需要導出的頭文件iconv.h在include\下,爲iconv.h.in或iconv.h.build.in。它們使用LGPL許可,而其他目錄下的源碼是GPL許可,我們也無需使用。
    打開MinGW Shell,切換到libiconv-1.14\下。其編譯過程與Linux下的編譯類似。./configure(收集系統信息,這需要等待比較長的時間),然後make編譯。之後可以在libiconv-1.14\include\下看到生成的頭文件iconv.h,在libiconv-1.14\lib\.libs\下看到編譯好的libiconv-2.dll,但因爲使用GNU GCC編譯,沒有生成.lib導入庫。如果需要隱式鏈接的話,就需要爲該dll產生一個導入庫。注意導入庫是不能跨編譯器使用的,在mingw中導入庫是.a格式(libiconv.dll.a),而MSVS中則是.lib格式。
    我們可以用Visual Studio的dumpbin.exe和lib.exe工具製作DLL的導入庫文件。先用dumpbin.exe輸出DEF文件,然後修改DEF文件使之符合語法,再用lib.exe生成.lib文件。
    首先生成dll庫的def文件:dumpbin /EXPORTS libiconv-2.dll > iconv.def。輸出的iconv.def內容如下:
  1. Microsoft (R) COFF/PE Dumper Version 10.00.30319.01  
  2. Copyright (C) Microsoft Corporation.  All rights reserved.  
  3.   
  4.   
  5. Dump of file libiconv-2.dll  
  6.   
  7. File Type: DLL  
  8.   
  9.   Section contains the following exports for libiconv-2.dll  
  10.   
  11.     00000000 characteristics  
  12.     50C075A5 time date stamp Thu Dec 06 18:38:29 2012  
  13.         0.00 version  
  14.            1 ordinal base  
  15.           13 number of functions  
  16.           13 number of names  
  17.   
  18.     ordinal hint RVA      name  
  19.   
  20.           1    0 00013000 _libiconv_version  
  21.           2    1 00011478 aliases2_lookup  
  22.           3    2 00011350 aliases_lookup = _locale_charset  
  23.           4    3 000120F0 iconv_canonicalize  
  24.           5    4 00011908 libiconv  
  25.           6    5 00011958 libiconv_close  
  26.           7    6 000114C0 libiconv_open = _libiconv_set_relocation_prefix  
  27.           8    7 00011970 libiconv_open_into  
  28.           9    8 00012580 libiconv_relocate  
  29.          10    9 000124C0 libiconv_set_relocation_prefix  
  30.          11    A 00011EB8 libiconvctl  
  31.          12    B 00011FC8 libiconvlist  
  32.          13    C 00012350 locale_charset  
  33.   
  34.   Summary  
  35.   
  36.         1000 .CRT  
  37.         1000 .bss  
  38.         1000 .data  
  39.         1000 .debug_abbrev  
  40.         1000 .debug_aranges  
  41.         1000 .debug_frame  
  42.        1F000 .debug_info  
  43.         6000 .debug_line  
  44.        18000 .debug_loc  
  45.         1000 .debug_pubnames  
  46.         1000 .debug_pubtypes  
  47.         4000 .debug_ranges  
  48.         1000 .debug_str  
  49.         1000 .edata  
  50.         4000 .eh_frame  
  51.         1000 .idata  
  52.        CD000 .rdata  
  53.         1000 .reloc  
  54.         1000 .rsrc  
  55.        12000 .text  
  56.         1000 .tls  
    ionv.def需要修改成符合模塊定義文件的語法。我們只要關心DEF文件定義裏的兩個段:LIBRARY段和EXPORTS段。LIBRARY段指出DLL的內部名,這裏爲libiconv-2;EXPORTS段指出導出的函數或數據。上面數據的中間部分列出了所有導出函數和數據,真正需要是orinal列(表示編號)和name列。把iconv.def修改成如下內容:
  1. LIBRARY      "libiconv-2"  
  2.   
  3. EXPORTS  
  4. _libiconv_version  @1  
  5. aliases2_lookup    @2  
  6. aliases_lookup = _locale_charset  @3  
  7. iconv_canonicalize  @4  
  8. libiconv  @5  
  9. libiconv_close  @6  
  10. libiconv_open = _libiconv_set_relocation_prefix  @7  
  11. libiconv_open_into  @8  
  12. libiconv_relocate  @9  
  13. libiconv_set_relocation_prefix  @10  
  14. libiconvctl  @11  
  15. libiconvlist  @12  
  16. locale_charset  @13  
    最後生成導入庫:lib /machine:ix86 /def:iconv.def,生成iconv.lib和iconv.exp文件。發佈時包含libiconv-2.dll, iconv.lib和iconv.h即可,並且注意它是使用LGPL許可的。
    (3)編譯zlib
    如果你還需要zlib來進行壓縮的話(這是可選的),還可以編譯出zlib庫,這個在我的zlib系列文章中有詳細介紹。直接用nmake運行zlib-1.2.7\win32\Makefile.msc即可。如下:
    nmake -f win32/Makefile.msc LOC="-DASMV -DASMINF" OBJA="inffas32.obj match686.obj"
    編譯出zlib1.dll及導入庫zlib.lib,頭文件爲zconf.h和zlib.h。
    好了。如果你嫌上述編譯過程麻煩,也可以直接從http://www.zlatkovic.com/libxml.en.html處獲取libxml2的編譯好的Windows版本,這個版本只提供了頭文件、庫文件和dll,不包含源代碼、例子程序和文檔。若用於解析xml,通常只需要下載libxml2庫、iconv庫和zlib庫就行了。現在提供的版本爲libxml2-2.7.8.win32.zip,iconv-1.9.2.win32.zip和zlib-1.2.5.win32.zip。注意iconv-1.9.2.win32.zip中包含有iconv.dll動態庫和iconv.exe程序,而iconv.exe是GPL授權的,要特別注意版權的問題。最好的方式還是像上面一樣自行編譯libiconv庫。
    若要使用Libxml2,可在Visual Studio 2010中新建一個解決方案Libxm2Learning,裏面有一個空的Libxml2Learning Win32控制檯項目,設置成Release模式。把libxml2.dll及導入庫libxml2.lib拷貝到解決方案的Release目錄下,所有頭文件(C:\libxml2\include目錄)拷貝到解決方案根目錄下。另外把libiconv-2.dll,iconv.lib和iconv.h也拷過來。新建應用程序項目時要設置項目屬性。在"C/C++ --->Additional Include Directories"中添加..\include\libxml2,以便能使用libxml2庫的頭文件。"Code Generation"中的運行時庫最好設置成/MT,"Linker--->Additional Dependencies"中添加..\Release\libxml2.lib和..\Release\iconv.lib以便鏈接時能找到導入庫。


    附:用MSVC編譯最新的libiconv
    最新的libiconv已經不提供用Visual C/C++和nmake來編譯了。如果一定要用Visual C++來編譯libiconv,我們需要對源碼的編譯過程做一些分析,然後對源代碼做一些調整。
    libiconv-1.14中,lib\和libcharset\下是libiconv和libcharset庫的源碼,需要導出的頭文件iconv.h在include\下,爲iconv.h.in或iconv.h.build.in。它們使用LGPL許可,而其他目錄下的源碼是GPL許可,我們也無需使用。iconv.h.build.in中包含一些@開頭的符號變量,這是爲了提高可移植性而定義的,它們用來收集一些特定於系統的編譯構建信息。在用./configure配置源碼時,這些變量會被configure掃描到的相關值替換掉,從而生成iconv.h。在Visual C++下編譯時沒有配置的過程,因此我們需要了解這些變量的含義。
    1)@HAVE_VISIBILITY@: 表示是否有__visibility__屬性。這是GCC/G++的__attribute__屬性擴展,表示導出符號的可見性,這在創建.so動態庫時有用。__attribute__((__visibility__("default")))表示導出的符號可見,而__attribute__ ((visibility("hidden")))可以防止從動態庫中導出符號。若用Microsoft Visual C++編譯器來編譯,顯然值爲0。
    2)@DLL_VARIABLE@: 表示後面聲明的變量是否是從外部DLL中導入過來的。如果是,本變量值設成__declspec (dllimport);如果不是,則設成空。顯然這裏可以設成空的。參考configure.ac中對本變量的處理。
    在Windows系統中,__declspec(dllimport)用於聲明一個導入函數,是說這個函數是從別的DLL(或EXE)導入,我要用。不使用__declspec(dllimport)導入外部函數也能正確編譯代碼,但使用__declspec(dllimport)使編譯器可以生成更好的代碼。編譯器之所以能夠生成更好的代碼,是因爲它可以確定函數是否存在於DLL中,這使得編譯器可以生成跳過間接尋址級別的代碼,而這些代碼通常會出現在跨DLL邊界的函數調用中。但是,必須使用__declspec(dllimport)才能導入DLL中使用的變量。
    __declspec(dllexport)用於聲明一個導出函數,是說這個函數要從本DLL導出,要給別人用,一般用在開發DLL時。使用這個聲明可以省掉在DEF文件中手工定義導出哪些函數的工作。當然,如果你的DLL裏全是C++的類的話,你無法在DEF裏指定導出的函數,只能用__declspec(dllexport)導出類。
    3)@EILSEQ@: EILSEQ是errno.h中定義的一個錯誤碼,表示非法字節序列(例如在MBCS字符串)。 一些系統像SunOS 4沒有EILSEQ,一些系統像BSD/OS在其他頭文件中有EILSEQ,在這些系統上就需要定義我們自己的EILSEQ。Linux, Windows上有這個錯誤碼,因此無需自己再定義,本變量值爲空。
    4)@ICONV_CONST@: 表示在"char"前面是否加上"const",例如在Linux系統上./configure後可以看到這個變量替換爲空,即使用"char**",而不是"const char**"。Windows上值爲"const"。
    5)@USE_MBSTATE_T@: 是否使用寬字符處理函數wchar.h。若要支持多種字符集,本變量值爲1。mbstate_t類型用於C的字符編碼轉換函數和C++的字符編碼轉換類,C/C++標準沒有規定具體的數據類型。mbstate_t類型的對象表示轉換函數mbrlen, mbrtowc, mbsrtowcs, wcrtomb或wcsrtombs的一個轉換狀態(這些函數在wchar.h中)。可用mbsinit()函數測試是否處於讀入新字符狀態。舉個例子,有些字符集包含了一類帶有狀態編碼的字符,如很多Latin語言繫帶有的重音符號(accent),通常用一個編碼表示一種accent,其後面的一個字符表示需要添加accent的字符(因此如果需要輸出accent本身,後面還得加另外一個字符,比如空格)。這種字符就是表示進入到某種狀態,用mbstate_t類型來描述這種狀態。
    6)@BROKEN_WCHAR_H@: wchar.h是否有bug。在帶桌面C工具包的HP Tru64 UNIX系統上有一個bug,包含<wchar.h>之前必須先包含<stdio.h>。在BSD/OS 4.0.1上有一個bug,必須在包含<wchar.h>之前必須先包含stddef.h>,<stdio.h>和<time.h>。本變量標記這樣的特殊情況。Linux, Windows上本變量值爲0。
    7)@HAVE_WCHAR_T@: 是否使用寬字符處理。若上面使用了寬字符處理,本變量值爲1。
    詳細的構建過程可參考一篇文章:http://www.codeproject.com/Articles/302012/How-to-Build-libiconv-with-Microsoft-Visual-Studio
    在Libxm2Learning解決方案下添加一個Win32 DLL空項目libiconv,設置編譯成Release版本。
    第一步:拷貝源文件
    把libiconv-1.14\lib\下的"relocatable.h", "relocatable.c"和"iconv.c"拷貝到libiconv項目目錄中。
    把libiconv-1.14\libcharset\lib\localcharset.c拷貝到libiconv項目目錄中。
    把libiconv-1.14\libcharset\include\localcharset.h.build.in拷貝到項目中,並重命名爲localcharset.h。
    把libiconv-1.14\windows\libiconv.rc拷貝到項目目錄。
    在libiconv項目下創建子目錄include,用來放各個頭文件。
    把libiconv-1.14\include\iconv.h.build.in拷貝到項目include子目錄下,並重命名爲iconv.h。
    把libiconv-1.14\config.h.in拷貝到項目include子目錄下,並重命名爲config.h。
    把libiconv-1.14\lib\下的所有頭文件(*.h)和模塊定義文件(*.def)拷貝到項目include子目錄下。
    第二步:設置項目屬性
    把項目根目錄下的兩個源文件、兩個文件和一個資源文件導入到libiconv項目視圖中。設置項目屬性。
    "VC++ Directories"設置:在"Include Directories"中添加include子目錄。
    "Preprocessor Definitions"設置:添加宏"BUILDING_LIBICONV"和"BUILDING_LIBCHARSET"。
    "Code Generation"設置:"Runtime Library"最好設置爲/MT,以靜態鏈接多線程版的C運行時函數庫。
    第四步:調整源代碼
    1)iconv.h: 按照上面介紹把各個@...@變量替換成相應值。更改函數導入導出聲明,即把以下針對gcc/g++的導出定義

  1. #if @HAVE_VISIBILITY@ && BUILDING_LIBICONV  
  2. #define LIBICONV_DLL_EXPORTED __attribute__((__visibility__("default")))  
  3. #else  
  4. #define LIBICONV_DLL_EXPORTED  
  5. #endif  
    修改爲針對MSVC的定義:
  1. #if BUILDING_LIBICONV  
  2. #define LIBICONV_DLL_EXPORTED __declspec(dllexport)  
  3. #elif USING_STATIC_LIBICONV  
  4. #define LIBICONV_DLL_EXPORTED  
  5. #else  
  6. #define LIBICONV_DLL_EXPORTED __declspec(dllimport)  
  7. #endif  
    2)libiconv.rc: 在前面添加以下定義。
  1. #define PACKAGE_VERSION_MAJOR       1  
  2. #define PACKAGE_VERSION_MINOR       14  
  3. #define PACKAGE_VERSION_SUBMINOR    0  
  4. #define PACKAGE_VERSION_STRING      "1.14"  
    3)localcharset.c: 刪掉或註釋掉以下幾行(76-79行)。
  1. /* Get LIBDIR.  */  
  2. /* 
  3. #ifndef LIBDIR 
  4. # include "configmake.h" 
  5. #endif 
  6. */  
    4)iconv.c: 把其中的ICONV_CONST宏(247行)改成const。
    5)localcharset.h: 更改其中函數導出導入的聲明。把以下針對gcc/g++的導出定義
  1. #if @HAVE_VISIBILITY@ && BUILDING_LIBCHARSET  
  2. #define LIBCHARSET_DLL_EXPORTED __attribute__((__visibility__("default")))  
  3. #else  
  4. #define LIBCHARSET_DLL_EXPORTED  
  5. #endif  
    修改爲針對MSVC的定義:
  1. #ifdef BUILDING_LIBCHARSET  
  2. #define LIBCHARSET_DLL_EXPORTED __declspec(dllexport)  
  3. #elif USING_STATIC_LIBICONV  
  4. #define LIBCHARSET_DLL_EXPORTED  
  5. #else  
  6. #define LIBCHARSET_DLL_EXPORTED __declspec(dllimport)  
  7. #endif  
    6)config.h: 刪掉或註釋掉以下內容(29-30行),否則會導致Windows上沒有EILSEQ定義,從而代碼編譯通不過。
  1. /* Define as good substitute value for EILSEQ. */  
  2. /*#undef EILSEQ*/  
    好了,一切準備就緒,編譯完之後就可以在解決方案的Release目錄中看到libiconv.dll了,以及導入庫libiconv.lib(若讓libxml2鏈接時使用,則需要改名爲iconv.lib)。發佈時還包含頭文件iconv.h。
    打開Visual Studio的命令提示符,運行dumpbin /EXPORTS libiconv.dll,可以看到DLL導出的各個函數名。
  1. Microsoft (R) COFF/PE Dumper Version 10.00.30319.01  
  2. Copyright (C) Microsoft Corporation.  All rights reserved.  
  3.   
  4.   
  5. Dump of file libiconv.dll  
  6.   
  7. File Type: DLL  
  8.   
  9.   Section contains the following exports for libiconv.dll  
  10.   
  11.     00000000 characteristics  
  12.     50B5EAAA time date stamp Wed Nov 28 18:42:50 2012  
  13.         0.00 version  
  14.            1 ordinal base  
  15.            9 number of functions  
  16.            9 number of names  
  17.   
  18.     ordinal hint RVA      name  
  19.   
  20.           1    0 000E8DC0 _libiconv_version = __libiconv_version  
  21.           2    1 00012810 iconv_canonicalize = _iconv_canonicalize  
  22.           3    2 000120C0 libiconv = _libiconv  
  23.           4    3 00012100 libiconv_close = _libiconv_close  
  24.           5    4 00011D90 libiconv_open = _libiconv_open  
  25.           6    5 00012120 libiconv_open_into = _libiconv_open_into  
  26.           7    6 00012420 libiconvctl = _libiconvctl  
  27.           8    7 00012600 libiconvlist = _libiconvlist  
  28.           9    8 00012970 locale_charset = _locale_charset  
  29.   
  30.   Summary  
  31.   
  32.         3000 .data  
  33.        CE000 .rdata  
  34.         2000 .reloc  
  35.         1000 .rsrc  
  36.        19000 .text    
    原始的libiconv使用LGPL許可,因此這個調整的libiconv也是LGPL許可,在使用時必須仔細注意授權的問題。如果動態鏈接libiconv.dll,則你的應用程序無需發佈源碼。如果編譯成靜態庫並使用靜態鏈接,則你的應用程序或者發佈源碼,或者發佈目標文件(*.obj),以便其他人通過靜態鏈接LGPL的libiconv來重新生成應用程序。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章