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。