peakzhang 发表于 2008-9-21 17:12:49

在linux下无法使用ACE_Dev_Poll_Reactor功能,链接失败

这个问题困扰我一个星期。我的平台是RedHat AS4,使用默认的内核安装编译ACE很顺利,但是没有办法使用epoll功能。初步想法是编译新内核,可是2.6的内核编译难度远远超过以往,10几次编译均告启动失败。后来仔细研究了一下为何ACE的脚本,configure在进行测试epoll_create的时候报告错误,把下载回来的config.log打开,把里面的测试代码编成一个cpp文件进行编译,居然报告是因为内核文件版本太低,无法使用!我马上明白了问题所在,问题在于,/usr/include/linux下面的文件都是2.4核心的文件,里面的version.h表明,版本是2.4的,如果使用这套文件进行编译,当然无法使用了。
使用Redhat AS4在/usr/src/kernels/下面的新文件,进行一下符号链接:
ln –sf /usr/src/kernels/2.6.9.22_EL.i386/linux /usr/include/linux
ln –sf /usr/src/kernels/2.6.9.22_EL.i386/asm /usr/include/asm
ln –sf /usr/src/kernels/2.6.9.22_EL.i386/scsi /usr/include/scsi
先提前给老的版本改名。
在进行处理后,configure报告错误了,无法进行处理,打开config.log仔细一查,居然是error没有定义,又发现了error.h没有找到。原来还有一个/usr/include/asm/error.h包含了<asm-gerneric/error.h>,而asm-gerneric没有定义,重新定义一个符号链接:
ln –sf /usr/src/kernels/2.6.9.22_EL.i386/asm-gerneric /usr/include/asm-gerneric
这时,configure通过了。可以进行make了。epoll_create创建成功。
问题还没完,这个时候去编译测试程序,测试程序使用了ACE_Dev_Poll_Reactor,结果仍然是失败,总是报告:undefined reference to ACE_Dev_Poll_Reactor。起初以为是无法找到链接库文件,因为按照ACE-install.html,编译的时候使用$ACE_ROOT/build目录,但是如果这样,库文件会放在: /usr/local/lib,总是无法找到。需要修改LD_LIBRARY_PATH,最后,发现如果直接在$ACE_ROOT/ace目录下使用make,库文件会放在正确的位置,但是仍然无法链接成功。
最后想到,Dev_Poll_Reactor这个文件编译需要定义ACE_HAS_EVENT_POLL宏,否则跳过,不编译。于是在config.h里面加入了#define ACE_HAS_EVENT_POLL,重新编译库,再重新编译测试文件,全部成功,运行正常。

wishel 发表于 2008-11-9 00:06:15

晕阿,遇到了同样的问题,我的linux是最新的ubuntu 8.10
在config.h里面加入了#define ACE_HAS_EVENT_POLL,编译ACE失败
后来make clean了一次再编译,来回2遍最后莫名其妙成功了

现在我的gcc版本是4.3.2,编译用ACE的程序的时候老是报很多‘xxx’的地址永远不会为 NULL的警告,比较讨厌
页: [1]
查看完整版本: 在linux下无法使用ACE_Dev_Poll_Reactor功能,链接失败