最近在处理Aix上面的一些问题,由于对aix系统刚刚接触,导致走了一引起弯路,现在整理出来,供大家参考。
本人使用的是aix 64位系统,编译器使用xlC。
一、链接库的问题
项目中链接了第三方的zlib、iconv、xml2库,zlib、iconv可以正常链接,xml2编译链接都没有问题,但运行时会出问题。提示运行时库未找到。尝试各种方法很久无果。
于是抱着试一试的心态将xlC的编译选项-q64去掉,编译、运行,发现竟然好了。
至此,便开始怀疑是xml位数不对的问题了。于是加上编译选项-q32,编译、运行仍然没有问题,确定是xml库的位数的问题。
经实践证明,在aix上iconv和libz貌似是不分32位和64位的,libxml2有32位和64位之分。
于是上网搜索,发现xml并没有自动适应平台,编译64位xml需要做如下配置
参考了网友的方法,自己的实践过程。
平台:AIX5.3
编译器:xlc 6.0.0.0
介质:libxml2-2.7.2.tar.gz
编译步骤:
1 ./configure --prefix=/home CC=xlc
2 修改Makefile文件如下:
CC = xlc -q64
AR = ar -X64
3 export OBJECT_MODE=64
make
4 make install
完了,重新将自己的编译选项改为64位,大功告成!
xlC在编译链接时竟然不报错真是一个大坑啊!
当然了也由于自己经验不足,没有及时去查看相应库的位数,导致走了弯路。
关于查看系统及库文件的位数请参看我的另一篇文章《如何判断Unix系统及库文件是32位还是64位的》。
二、动态链接和静态链接的问题
Linux和Aix下默认均为动态链接,通过添加编译选项指定其为静态链接方式。
1、Aix
Aix下使用xlC编译器,添加编译选项-bstatic或-bdynamic指定其为静态链接或动态链接。但如果指定某个库为静态链接,则需要在其前面加上-bstatic,后面加-bdynamic,否则后面所有的库均会使用静态链接。例如:
xlC_r -q64 -c -qpic=large -g -I. -I/usr/local/include main.cpp
xlC_r -q64 -g -brtl -o test main.o -L/usr/local/lib -lxml2 -liconv
则生成的test程序中则会动态链接libxml2.a,libiconv.a。
xlC_r -q64 -c -qpic=large -g -I. -I/usr/local/include main.cpp
xlC_r -q64 -g -brtl -o test main.o -L/usr/local/lib -bstatic -lxml2 -liconv
则生成的test程序中则会静态链接libxml2.a,libiconv.a。
xlC_r -q64 -c -qpic=large -g -I. -I/usr/local/include main.cpp
xlC_r -q64 -g -brtl -o test main.o -L/usr/local/lib -lxml2 -bstatic -liconv -bdynamic
则生成的test程序中则会动态链接libxml2.a,静态链接libiconv.a。
2、Linux
Linux下使用gcc/g++编译器,资料上看是采用-static和-dynamic编译选项,但尝试后并无效果,等以后有机会再尝试。
g++ -c -g -Wall -fPIC -D_REENTRANT -D_DEBUG -D_FILE_OFFSET_BITS=64 -I. -I/usr/include/libxml2 main.cpp
g++ -g -o test main.o -L/usr/local/lib -lxml2
则test动态链接libxml.so
使用下面方式可以进行静态链接,不使用-l,直接将xx.a编译进去即可。
g++ -c -g -Wall -fPIC -D_REENTRANT -D_DEBUG -D_FILE_OFFSET_BITS=64 -I. -I/usr/include/libxml2 main.cpp
g++ -g -o test main.o -L/usr/local/lib /usr/local/lib/libxml2.a
则test静态链接libxml.a