居然要登录 发表于 2008-3-9 19:39:56

HP 64位机器编译ACE库 使用Task activate线程失败问题

GNU文件使用platform_hpux_aCC.GNU(修改buildbits=64), config使用config-hpux-11.00.h,ACE版本5.4/5.5
编译选项未做任何变动

使用编译成功的库测试,发现Task activate线程会失败,单步调试跟到OS_NS_Thread.cpp文件中的ACE_OS::thr_create调用中
if(::thread_attr_init(&attr)!=0) return -1;

经验证,如果buildbits=32, 在32位下该调用则正常

请教下有经验的前辈,该问题是什么原因导致,是否是因为编译库的时候编译选项或者编译宏问题?

peakzhang 发表于 2008-3-11 16:05:12

有可能是编译宏、选项的问题。
64位处理一些数据类型的时候,和32位有差别。

居然要登录 发表于 2008-3-11 21:48:55

是编译选项的问题,根据HP工程师的说法,在HP下编译多线程库和应用,只须加-mt选项,链接无须-lpthread, 在HP系统下为了兼容以前版本存在两个pthread库, 如果链接错误会导致应用起线程异常。

babyblue_993 发表于 2008-3-11 22:55:07

个人看法

应该是在makefile中把distrib设为1,buildbits设为64吧?
理由如下,看样子只有在distrib为1的时候,才会选择正确的库吧?
ifeq ($(distrib),1)

ifeq ($(word 2,$(HPVERS_WORDS)), 10)
SOFLAGS         += -Wl,-x -Wl,+h/usr/lib/$(@F)
else
ifeq ($(buildbits),32)
SOFLAGS         += -Wl,-x -Wl,+h$(@F) -Wl,+b/usr/lib
endif
ifeq ($(buildbits),64)
SOFLAGS         += -Wl,-x -Wl,+h$(@F) -Wl,+b/usr/lib/pa20_64
endif
endif

endif

居然要登录 发表于 2008-3-12 22:27:32

原帖由 babyblue_993 于 2008-3-11 22:55 发表 http://www.acejoy.com/bbs/images/common/back.gif
应该是在makefile中把distrib设为1,buildbits设为64吧?
理由如下,看样子只有在distrib为1的时候,才会选择正确的库吧?
ifeq ($(distrib),1)

ifeq ($(word 2,$(HPVERS_WORDS)), 10)
SOFLAGS         += -Wl,-x -Wl,+h/usr/ ...

SOFLAGS似乎没什么用途, 不用distrib为1,只要buildbits=64就OK,因为带了-mt, 会自动选择正确的库。
lld查下生成库的依赖关系就知道

[ 本帖最后由 居然要登录 于 2008-3-13 22:57 编辑 ]
页: [1]
查看完整版本: HP 64位机器编译ACE库 使用Task activate线程失败问题