peakzhang 发表于 2007-12-19 22:11:28

这样怎么还是出错?epoll在ACE中的使用


#include"ace/Dev_Poll_Reactor.h"
#include"ace/Reactor.h"
int main()
{
      ACE_Dev_Poll_Reactor dr;
      ACE_Reactor r(&dr);
      ACE_Reactor::instance(&r);
      return 0;
}


上面是代码,编译情况如下:

config.h中是

#define ACE_HAS_EVENT_POLL 1
#include "ace/config-linux.h"

$ACE_ROOT/include/makeinclude/platform_macros.GNU中是

include $(ACE_ROOT)/include/makeinclude/platform_linux.GNU

编译ACE库都通过了,但是上面的代码我执行命令:g++ -o echo epoll.cpp -L$LD_LIBRARY_PATH -lACE -DACE_HAS_EVENT_POLL
出错,。提示为:

/tmp/cc1AtFnv.o(.text+0x37): In function `main':
: undefined reference to `ACE_Dev_Poll_Reactor::ACE_Dev_Poll_Reactor(ACE_Sig_Handler*, ACE_Timer_Queue_T<ACE_Event_Handler*, ACE_Event_Handler_Handle_Timeout_Upcall<ACE_Recursive_Thread_Mutex>, ACE_Recursive_Thread_Mutex>*, int, ACE_Reactor_Notify*, int, int)'
/tmp/cc1AtFnv.o(.text+0x8a): In function `main':
: undefined reference to `ACE_Dev_Poll_Reactor::~ACE_Dev_Poll_Reactor()'
/tmp/cc1AtFnv.o(.text+0xda): In function `main':
: undefined reference to `ACE_Dev_Poll_Reactor::~ACE_Dev_Poll_Reactor()'
collect2: ld returned 1 exit status
去掉-DACE_HAS_EVENT_POLL也不对。

高手帮忙了

peakzhang 发表于 2007-12-19 22:11:39

现在的进展是,我到tests下,运行make,提示如下:

make: Entering directory `/home/tqg/ACE-5.5/ACE_wrappers/tests'

GNUmakefile: /home/tqg/ACE-5.5/ACE_wrappers/tests/GNUmakefile.Test_Output MAKEFLAGS=w

Installing libTest_Output.so -> ../lib
Installing libTest_Output.so.5.5.0 -> ../lib
make: Leaving directory `/home/tqg/ACE-5.5/ACE_wrappers/tests'
make: Entering directory `/home/tqg/ACE-5.5/ACE_wrappers/tests'

GNUmakefile: /home/tqg/ACE-5.5/ACE_wrappers/tests/GNUmakefile.MT_Reactor_Upcall_Test MAKEFLAGS=w

g++ -W -Wall -Wpointer-arith -O3 -g -pipe    -D_REENTRANT -DACE_HAS_AIO_CALLS -D_GNU_SOURCE   -I/home/tqg/ACE-5.5/ACE_wrappers -DACE_HAS_EXCEPTIONS -D__ACE_INLINE__ -I..-Wl,-E -L/home/tqg/ACE-5.5/ACE_wrappers/ace -L./ -L. -L../lib -o MT_Reactor_Upcall_Test .obj/Main.o .obj/MT_Reactor_Upcall_Test.o -lTest_Output -lACE-ldl -lpthread -lrt
.obj/MT_Reactor_Upcall_Test.o(.text+0xbca): In function `run_main(int, char**)':
/home/tqg/ACE-5.5/ACE_wrappers/tests/MT_Reactor_Upcall_Test.cpp:338: undefined reference to `ACE_Dev_Poll_Reactor::ACE_Dev_Poll_Reactor(ACE_Sig_Handler*, ACE_Timer_Queue_T<ACE_Event_Handler*, ACE_Event_Handler_Handle_Timeout_Upcall<ACE_Recursive_Thread_Mutex>, ACE_Recursive_Thread_Mutex>*, int, ACE_Reactor_Notify*, int, int)'
.obj/MT_Reactor_Upcall_Test.o(.text+0xc5b):/home/tqg/ACE-5.5/ACE_wrappers/tests/MT_Reactor_Upcall_Test.cpp:366: undefined reference to `ACE_Dev_Poll_Reactor::~ACE_Dev_Poll_Reactor()'
.obj/MT_Reactor_Upcall_Test.o(.text+0xd19):/home/tqg/ACE-5.5/ACE_wrappers/tests/MT_Reactor_Upcall_Test.cpp:366: undefined reference to `ACE_Dev_Poll_Reactor::~ACE_Dev_Poll_Reactor()'
collect2: ld returned 1 exit status
make: *** Error 1
make: Leaving directory `/home/tqg/ACE-5.5/ACE_wrappers/tests'
make: *** Error 2

可以发现应该是编译的ACE库的时候,epoll的功能没有被加入?

peakzhang 发表于 2007-12-19 22:11:47

我和你现在要做的事情一样.

首先你的机器的内核库文件是2.6的.

AS4自带这样的库文件,

在编译之前在

config.h或config-linux.h中加入

#define ACE_HAS_EVENT_POLL

然后重新编译ACE库.

peakzhang 发表于 2007-12-19 22:11:57

我的version.h里面的内容是:

#define UTS_RELEASE "2.4.20"
#define LINUX_VERSION_CODE 132116
#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))


是不是,默认不是2.6内核版本?

    我的系统目录/usr/src/下面好像没有kernels,汗啊。。

peakzhang 发表于 2007-12-19 22:12:06

问题在于,/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,重新编译库,再重新编译测试文件,全部成功,运行正常。

webmaster 发表于 2009-11-27 19:42:58

版主真是太厉害了
我按照你的最后一个帖子正在make呢
页: [1]
查看完整版本: 这样怎么还是出错?epoll在ACE中的使用