由于一直使用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
这五个包,分别安装。下载地址:
安装成功后,自行写一个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