gSOAP
號稱是跨平臺的工具包,不過畢竟是屬于
g
字頭的,如果沒有了一系列
GNU
組件的支持,在其他類
Unix
系統(tǒng)編譯也會遇到不少困難。
gSOAP
的
README
說得也不是很清楚,只提到依賴于這些組件:
1. Automake
tools (make and GNU m4) to
configure and build
2. Bison
http://www.gnu.org/software/bison
or the alternative Yacc
3. Flex
http://flex.sourceforge.net
4. OpenSSL
(for optional HTTPS)
http://www.openssl.org
5. Zlib
(for optional compression)
http://www.zlib.net
6. Pthreads
or win32 threads (optional)
實際上,我在
HP-UX
下編譯
gSOAP
的時候發(fā)現(xiàn),要成功編譯,還需要安裝
autoconf
、
gawk
和
make
,為解決中文亂碼問題,還需要安裝
libiconv
。雖然原系統(tǒng)就有
awk
和
make
,但是由于版本問題,編譯時出錯。所以,建議大家編譯最新版的
gSOAP-2.7.17
時,按一下順序安裝組件:
1.
autoconf-2.66
(http://ftp.gnu.org/gnu/autoconf/
)
autoconf
是一個用于生成可以自動地配置軟件源代碼包以適應多種
Unix
類系統(tǒng)的
shell
腳本的工具。
2.
automake-1.10
(http://ftp.gnu.org/gnu/automake/
)
automake
是一個從文件
Makefile.am
自動生成
Makefile.in
的工具。每個
Makefile.am
基本上是一系列
make
的宏定義(
make
規(guī)則也會偶爾出現(xiàn))。生成的
Makefile.in
服從
GNU Makefile
標準。
3.
m4-1.4.14
(http://ftp.gnu.org/gnu/m4/
)
m4
是一個宏處理器。
4.
gawk-3.1.8
(http://ftp.gnu.org/gnu/gawk/
)
awk
地球人都知道。
HP-UX
自帶的
awk
不是
GNU
的,編譯
gSOAP
時執(zhí)行某些語句出錯,因此在編譯
gSOAP
時要使用
GNU
新版本。
5.
make-3.81
(http://ftp.gnu.org/gnu/make/
)
make
也是地球人都知道。
HP-UX
自帶的
make
編譯
gSOAP
時會出錯。
6.
bison-2.4
(http://ftp.gnu.org/gnu/bison/
)
語法分析生成器。
7.
flex-2.5.35
(http://flex.sourceforge.net/
)
詞法分析生成器。
8.
zlib-1.2.5
(http://www.zlib.net/
)
gzip
和
LZW
壓縮庫。
9.
libiconv-1.13.1
(http://ftp.gnu.org/pub/gnu/libiconv/
)
字符編碼轉(zhuǎn)換工具,上一節(jié)有介紹。
openssl
原來就已經(jīng)有,無需安裝。如果沒有或者版本很低,可以到這里下載:
http://www.openssl.org/source/
補充事項:
1.
如何判斷某個組件是否需要安裝?
很簡單,到
LFS
官方網(wǎng)站參考用戶手冊:
http://www.linuxfromscratch.org/lfs/view/stable/
,查看一下該組件包含的
Installed program
,然后在命令行使用
which
命令找一下,如果找不到,可以肯定需要安裝
2.
如何判斷某個組件是否需要升級?
如果通過上述方法能夠找到已安裝的組件,但是文件的時間比較久遠,而且不支持
—help
參數(shù)查看幫助信息或者
—version
參數(shù)查看版本信息,幾乎可以肯定需要升級,因為比較新的
GNU
程序一般都支持這些參數(shù)。如果通過
--version
顯示版本較低,也應該升級
3.
上述組件的安裝一般都是
./configure && make
&& make install
三部曲。如果沒有
root
權(quán)限,可以使用
./configure --prefix=/path/to/your/directory
指定合法的安裝路徑,然后根據(jù)需要指定
PATH
和
SHLIB_PATH
環(huán)境變量。千萬要注意,
HP-UX
的動態(tài)鏈接庫的環(huán)境變量是
SHLIB_PATH
,而不是和
Linux
下的
LD_LIBRARY_PATH
4.
設(shè)置環(huán)境變量的時候也要注意,如果系統(tǒng)中已經(jīng)有舊版本的組件,并且新舊版本不在同一目錄,
export
環(huán)境變量的時候要把新版本組件所在的
lib
目錄居前
,這樣系統(tǒng)才能優(yōu)先搜索得到
5.
HP-UX
下編譯
flex-2.5.35
時會遇到一個棘手的問題
ld: Unsatisfied symbol "rpl_realloc" in file dfa.o
1 errors.
collect2: ld returned 1 exit status
以
rpl_realloc
為關(guān)鍵字搜索,發(fā)現(xiàn)它出現(xiàn)在
configure
步驟產(chǎn)生的
config.h
當中
/* Define to rpl_realloc if the replacement function should be
used. */
#define realloc rpl_realloc
看樣子,可能是為了避免有些系統(tǒng)沒有
realloc
,而轉(zhuǎn)用
rpl_realloc
代替。這個
rpl_realloc
不知是哪個系統(tǒng)的函數(shù),
HP-UX
應該可以使用
realloc
這個標準
C
函數(shù)呀!于是,把這一行注釋了,重新
make
就正常了
6.
gSOAP-2.7.17
的編譯指定要
automake-1.10
版本,如果像我那樣不慎安裝了
automake-1.11
,需要自行在其
bin
目錄創(chuàng)建兩個鏈接,否則
gSOAP
就是傻到不認帳!
aclocal-1.10 -> aclocal-1.11
automake-1.10 -> automake-1.11
7.
gSOAP
的傻事還不止一件,它只認
flex
的動態(tài)庫而不認靜態(tài)庫
,偏偏
flex
只安裝了靜態(tài)庫。所以,安裝
flex
之后,需要手動編譯以生成
libfl.so
,然后再拷貝到其
lib
目錄。
gcc -shared -fPCI -o
libfl.so libmain.o libyywrap.o
此外,還需要在其
lib
目錄創(chuàng)建兩個鏈接,其中第一個是
LFS
為保持
lex
與
flex
的兼容性而建議的,至于第二個,完全是遷就
gSOAP
的壞脾氣
libl.so -> libfl.so
libl.so.1 -> libl.so
如果上述準備工作全部完畢,那么即可正式編譯
gSOAP
。編譯步驟同樣是
./configure && make && make
install
,似乎乏善可陳。但是,
gSOAP-2.7.17
似乎有一個
bug
,在
HP-UX
下編譯會報錯:
stdsoap2_cpp.cpp:
In function 'size_t frecv(soap*, char*, size_t)':
stdsoap2_cpp.cpp:876:
error: invalid conversion from 'socklen_t*' to 'int*'
stdsoap2_cpp.cpp:876:
error:
initializing argument 6 of 'int
recvfrom(int, void*, int, int, void*, int*)'
stdsoap2_cpp.cpp:
In function 'int tcp_connect(soap*, const char*, const char*, int)':
……
一大堆錯誤信息,其實是指向同一個錯誤:
invalid
conversion from 'socklen_t*' to 'int*'
首先,使用
find
命令查找
stdsoap2_cpp.cpp
只有一個
> find . -name
"stdsoap2_cpp.cpp"
./gsoap/stdsoap2_cpp.cpp
然后,根據(jù)錯誤信息,查看該源程序的
876
行附近,函數(shù)的第六個參數(shù),也就是最后一個參數(shù)
k
是
SOAP_SOCKLEN_T
類型的
接著,查找所有的頭文件,看看該類型是哪個文件定義的
> find . -name
"*.h" | xargs grep -l SOAP_SOCKLEN_T
./gsoap/samples/calc_vs2005/calc_vs2005/stdsoap2.h
./gsoap/samples/wsse/stdsoap2.h
./gsoap/stdsoap2.h
./gsoap/VisualStudio2005/wsdl2h/wsdl2h/stdsoap2.h
很明顯,就在
./gsoap/stdsoap2.h
中。
Vi
之,在
709
行開始其定義:
709
/* Portability: define SOAP_SOCKLEN_T */
710
#if defined(_AIX)
711
#
if defined(_AIX43)
712
#
define SOAP_SOCKLEN_T socklen_t
713
#
else
714
#
define SOAP_SOCKLEN_T int
715
#
endif
716
#elif defined(SOCKLEN_T)
717
#
define SOAP_SOCKLEN_T SOCKLEN_T
718
#elif defined(__socklen_t_defined) || defined(_SOCKLEN_T) ||
defined(CYGWIN) || defined(FREEBSD) || defined(__FreeBSD__) || defined(OPENBSD)
|| define
d(__QNX__)
|| defined(QNX) || defined(OS390) ||
defined(HP_UX)
719
# define SOAP_SOCKLEN_T socklen_t
720
#elif defined(IRIX) || defined(WIN32) || defined(__APPLE__) ||
defined(SUN_OS) || defined(OPENSERVER) || defined(TRU64) || defined(VXWORKS)
721
#
define SOAP_SOCKLEN_T int
722
#else
723
#
define SOAP_SOCKLEN_T size_t
724
#endif
注意
718
和
719
行,
gSOAP-2.7.17
在
HP-UX
下,把
SOAP_SOCKLEN_T
定義為
socklen_t
,而其它操作系統(tǒng)不是定義為
int
就定義為
size_t
,再聯(lián)系之前的錯誤信息
invalid conversion from 'socklen_t*' to
'int*'
,很清楚了,只要在
719
行把
socklen_t
改為
int
就肯定能夠在
HP-UX
下編譯通過了?;蛘邍乐斠恍?,把
718
行的
defined(HP_UX)
移到
720
行最后也可以。
上面的問題解決了,繼續(xù)編譯工作,很可能會遇上另一個問題
/usr/lib/hpux32/dld.so:
Unsatisfied data symbol 'yylsp' in load module '/usr/lib/hpux32/libl.so.1'.
/usr/lib/hpux32/dld.so:
Unsatisfied data symbol 'yyolsp' in load module '/usr/lib/hpux32/libl.so.1'.
/usr/lib/hpux32/dld.so:
Unsatisfied data symbol 'yyfnd' in load module '/usr/lib/hpux32/libl.so.1'.
……
這是由于系統(tǒng)原來就裝有
flex
,但不是最新版本,結(jié)果系統(tǒng)搜索到舊版本的
libl.so.1
而搜索不到新版本
libl.so.1
,這就是為什么我在前面要特別強調(diào),
export
環(huán)境變量的時候,要確保新版本所在的路徑在前面,并且要在
flex
的
lib
目錄建立兩個鏈接的原因。
按照上述步驟和錯誤處理方法,在
HP-UX
下編譯
gSOAP
應該是不成問題的,推而廣之,在其它
Unix
下編譯
gSOAP
也應該差不多。
最后一個小問題是,在
HP-UX
下要使用剛剛編譯出來的
soapcpp2
生成存根程序,而不要使用前四節(jié)在
linux
目錄下的
soapcpp2
> ../../src/soapcpp2
-C -L -x stock.h
更進一步,如果在
HP-UX
下,需要用到
libxml2
解析
SOAP
響應消息,除了編譯源代碼之外,也可以直接到下列網(wǎng)址下載基于
HP-UX
的二進制包:
http://hpux.connect.org.uk/hppd/hpux/Gnome/libxml2-2.7.7/
這個地址提供了幾種版本的二進制包,下載之前應該在命令行輸入
uname –a
查看一下當前的操作系統(tǒng)信息:
> uname -a
HP-UX hostname
B.11.23
U
ia64
0850816723 unlimited-user license
根據(jù)以上信息,應當下載
Operating System
為
HP-UX 11i v2(HP-UX 11.23)
,
Architecture
為
Itanium 2
的二進制包
下載的包是
libxml2-2.7.7-ia64-11.23.depot.gz
。把它解壓后,有
root
權(quán)限的可以使用
HP-UX
專門的包管理工具安裝。沒有
root
權(quán)限也不要緊,
depot
其實就是一個
tar
包,可以直接使用
tar
解包,把解包后的文件移動到合適的目錄,再設(shè)置好
PATH
和
SHLIB_PATH
環(huán)境變量即可。
http://blog.csdn.net/yui/archive/2010/08/09/5799465.aspx