Chinaunix首页 | 论坛 | 博客
  • 博客访问: 104574323
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: C/C++

2008-05-06 17:36:13

作者: Lhhba  出自:
由于一直使用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

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的资源使用情况。
阅读(833) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~