32位linux程序移植,linux32位系统-64位系统移植遇到的问题和解决方法

1.loses precision问题。

编译错误类似如下提示:

Compling ../alarmMsg.cpp... ../alarmMsg.cpp: In member function 鈥榖ool AlarmShmOp::initialize(bool)鈥?

../alarmMsg.cpp:114: error: cast from 鈥楴eMsgItem*鈥?to 鈥榠nt鈥?loses precision

问题代码示例:

shm=(MsgItem *)shmat(shm_id,(void *)0,0);

问题原因:

shmat函数返回值为void,在32位机器上为32位,64位机器上为64位,而强制转换的枚举类型MsgItem在64位机器上是32位或更短的类型,因此出错。

解决方法:

在makefile中增加g++的编译参数 -m32,指定为32位编译。

2.编译器类问题。

编译错误类似如下提示:

Compling Channel.cpp... SSLsocket.hpp:67: error: extra qualification 鈥楽SSLsocket::鈥?on member 鈥榗lose鈥?

问题代码示例:

virtual SWIstream::Result SSLsocket::close();

问题原因:

编译器版本升级,对于语法检查更加严格。在类定义中定义类成员函数,不再需要添加类名。

解决方法:

去掉类名前缀,virtual SWIstream::Result close();

3.类库版本问题。

编译错误类似如下提示:

Building /home/bin/hello... /usr/bin/ld: warning: libstdc++.so.5, needed by /home/ivr/vap/lib/libxerces-c.so, may conflict with libstdc++.so.6

问题原因:

linux版本升级后,默认的函数库多数也随之升级。编译所需的libstdc++.so.5已被libstdc++.so.6替代。

解决方法:

多数linux系统升级后还保留有libstdc++.so.5,因此在makefile编译参数中直接指定使用这个库即可:

PUBLIC_LIB =\

`if test "\`uname\`" = "Linux"; then echo \

-L$(VAPHOME)/lib -lpthread -ljs -lxerces-c -lssl /usr/lib/libstdc++.so.5;\

4.

编译错误类似如下提示:

Building /home/bin/hello... /usr/bin/ld: warning: i386:x86-64 architecture of input file `inet/util_date.o' is incompatible with i386 output

问题原因:

依然是32位和64位的问题。g++的编译参数添加了 -m32,但gcc没有添加,因此*.c的源代码编译为64位,无法与32位的联接。

解决方法:

在makefile中增加gcc的编译参数 -m32。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值