由于一直使用linux和win32来进行程序开发,对程序的移植性只考虑到了这两个平台之间的,后来,程序需要移植到AIX5.3上,当时认为AIX也属类UNIX系统,应该支持POSIX标准,对于移植不存在什么问题。但在实践中还是发现了一些问题,总结如下:
1,编译器
在AIX上一般使用自带的xlc编译C++代码,这里还是采用GCC来编译,从IBM上下载
gcc-4.0.0-1.aix5.3. c.rpm,
gcc-cplu lus-4.0.0-1.aix5.3. c.rpm,
libgcc-4.0.0-1.aix5.3. c.rpm,
li tdcplu lus-4.0.0-1.aix5.3. c.rpm,
li tdcplu lus-devel-4.0.0-1.aix5.3. c.rpm
这五个包,分别安装。下载地址:http://www-03.ibm.com/servers/aix/products/aixos/linux/download.html
安装成功后,自行写一个hello world的小程序测试,发现程序在link的时候会报一堆的错误,如:
ld: 0711-317 ERROR: Undefined symbol: cout
ld: 0711-317 ERROR: Undefined symbol: .ostream::operator<<(char const *)
ld: 0711-345 Use the -bloadmap or -bnoquiet option to obtain more information.
collect2: ld returned 8 exit status
原因:AIX不会默认把stdc++库载入,需要自行指定,在编译中加上-lstdc++ -L/usr/local/lib(即libstdc++.a所在的目录)。
另外,如果编译的是C++代码,一定要用G++来编译,在AIX上编译时,用GCC来编译照样会成功,但一些C++的特性在运行时会表现不出来,导致出错,例如,我在程序中用到异常处理,但该文件用GCC来编译,发现编译成功,但运行时,无论如何都捕获不到throw出来的异常,改用G++编译,成功。
2,操作系统SDK
在AIX上有小部份API与linux上不同,比如gethostbyname_r所带的参数会不一样,等等,另外,还有一些常量是没有定义的,比如你要在你公用的头文件中定义:
#ifndef AF_UNIX
#define AF_UNIX 1
#endif
#ifndef AF_INET
#define AF_INET 2
#endif
#ifndef PF_UNIX
#define PF_UNIX AF_UNIX
#endif
#ifndef PF_INET
#define PF_INET AF_INET
#endif
#ifndef AF_LOCAL
#define AF_LOCAL AF_UNIX
#endif
#ifndef PF_LOCAL
#define PF_LOCAL PF_UNIX
#endif
3,线程安全性
在AIX上的程序如果使用了多线程,程序一定要在编译时加上-D_THREAD_SAFE或者-D_THREAD_SAFE_ERRNO,查看/usr/include/errno.h就不难发现其原因了。否则程序会报出很多奇奇怪怪的错误,搞得你头大。
另外,如果你使用了第三方库,你一定要检查一下,看它是否有分单线程或者多线程的版本,比如sybase数据库的ct-lib库,在AIX上就有分libct.so和libct_r.so,当然还你要搞清楚你安装的操作系统是多少位的,32bit或者64bit,同样有libct64.so和libct64_r.so。
4,Makefile文件
在AIX上自己可以安装一个GUN的make,这样你就不用太大改动你在linux下的Makefile文件了,但还是有小许地方是要改动的,比如你有使用到.so文件,你不能用-l某某库的方式,你必须以全路径方式,与.o文件一起link起来,比如你要用到libsybdb.so,如果你用-lsybdb,-L$(SYBASE)/lib,编译时还是会报找不到该SO文件,你可以用$(SYBASE)/lib/libsybdb.so直接把全路径编译,正常。
以上一些,是我在实际中发现的一些问题,因为对AIX也不太熟悉,并不确定是否是因为我本身的配置或者其它别的原因导致的,如果哪位高手发现有更好的办法,望指点。另如还有其它的一些经验,也希望补充。谢谢!
其次,介绍几个比较好的工具,以网络邻居方式访问AIX上文件:samba for aix,同样也有linxu版本。另外,查看是否内存泄露:svmon -P PID -i N就每隔N秒打印一下进程PID的资源使用情况。