Freebsd 6.2下编译ACE 5.6.x

遇到两个错误:
1、

In file included from ../../ace/OS_NS_signal.h:149,
                 from ../../ace/Signal.h:29,
                 from ../../ace/Dev_Poll_Reactor.cpp:5:
../../ace/OS_NS_signal.inl: In function 'int ACE_OS::pthread_sigmask(int, const sigset_t*, sigset_t*)':
../../ace/OS_NS_signal.inl:31: error: '::pthread_sigmask' has not been declared
gmake[3]: *** [libACE_la-Dev_Poll_Reactor.lo] 错误 1
gmake[3]: Leaving directory `/data0/install/ACE_wrappers/objdir/ace'
gmake[2]: *** [all-recursive] 错误 1
gmake[2]: Leaving directory `/data0/install/ACE_wrappers/objdir/ace'
gmake[1]: *** [all] 错误 2
gmake[1]: Leaving directory `/data0/install/ACE_wrappers/objdir/ace'
gmake: *** [all-recursive] 错误 1

解决办法:
打开ace/OS_NS_signal.inl,在头部添加

     #include <pthread.h>
     #include <signal.h>

2、

In file included from ../../ace/OS_NS_netdb.h:142,
                 from ../../ace/ICMP_Socket.cpp:9:
../../ace/OS_NS_netdb.inl: In function 'hostent* ACE_OS::gethostbyaddr_r(const char*, int, int, hostent*, char*, int*)':
../../ace/OS_NS_netdb.inl:189: error: cannot convert 'int*' to 'hostent**' for argument '7' to 'int gethostbyaddr_r(const void*, socklen_t, int, hostent*, char*, size_t, hostent**, int*)'
../../ace/OS_NS_netdb.inl: In function 'hostent* ACE_OS::gethostbyname_r(const char*, hostent*, char*, int*)':

解决办法:
打开ace/config.h,在其中添加

#define ACE_LACKS_NETDB_REENTRANT_FUNCTIONS

其它还有一些勉强可忽略的检测。
1、sem
编译的过程中会检测posix semaphores是否可用。
所用的测试代码如下:

  #include <semaphore.h>

  #ifndef SEM_FAILED
  # define SEM_FAILED ((sem_t *) -1)
  #endif

  int
  main ()
  {
    sem_t *s = 0;

    s = sem_open ("ace_semapho", O_CREAT | O_EXCL, 0600, 1);

    if (s == SEM_FAILED){
      perror("fail");
      return -1;  /* FAILURE */
    }

    if (sem_close (s) != 0)
      return -1;  /* Something went wrong! */

    return 0;
  }

尽管freebsd从很早开始已经支持posix semaphores,但是一般而言需要重新配置内核或者动态加载进来(kldload sem)。
但是freebsd对于named posix semaphores的名称有一些限制,如必须以/开头,长度不能超过12个字节等。
这需要打开configure/configure.ac,找到这一行

 s = sem_open ("ace_semaphore_foo", O_CREAT | O_EXCL, 0600, 1);

改成这样

 s = sem_open ("/ace_sem", O_CREAT | O_EXCL, 0600, 1);

然后检查config.h中是不是有ACE_LACKS_NAMED_POSIX_SEM。不过,鉴于其代码中没有估计sem的名称必须以/开头这一点,所以还是先不要用这个比较好,还是采用mmap/flock模拟吧。

2、net/if.h
configure的时候会报告说net/if.h存在但是无法被编译,嗯,先忽略吧。

3、pthread process scope
pthread库中,有些函数尽管存在,但是无法被使用。所以要在config.h的开头加入如下内容

  • ACE_LACKS_CONDATTR_PSHARED
  • ACE_LACKS_MUTEXATTR_PSHARED
  • ACE_LACKS_SETSCHED

p.s.有心的人去帮忙利用freebsd的kqueue实现reactor吧。这个在处理大量连接的时候,效率要高。select/poll的效率和fdset的数量之间大概是O(n)的关系,而kevent是O(1)。

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥