使用apr apache portable runtime

5016阅读 0评论2012-11-07 mfc42d
分类:C/C++

4年不用apr写程序,发现apr变化了不少
出现/usr/local/apr/include/apr-1/apr.h:358: 错误:expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘apr_off_t’
打开apr.h 358行
typedef off64_t apr_off_t;
应该是off64_t 没定义, grep off64_t  /usr/include/*.h
发现unistd.h 中:

# if defined __USE_LARGEFILE64 && !defined __off64_t_defined
typedef __off64_t off64_t;
# define __off64_t_defined
# endif

 __USE_LARGEFILE64 没有被定义,  grep __USE_LARGEFILE64  /usr/include/*.h
发现features.h 中

#ifdef _LARGEFILE64_SOURCE
# define __USE_LARGEFILE64 1
#endif
解决办法有如下几个
1 文件第一行定义  define 了 _LARGEFILE64_SOURCE ,不建议使用
2 修改apr.h change "off64" into "long long" of the file /usr/local/apr/include/apr-1/apr.h
 typedef off64 apr_off_t  -> typedef long long apr_off_t
3 编译的时候加上 -D_LARGEFILE64_SOURCE
创建文件 test.c
#include "apr_pools.h"
#include
 
int main()
{
    apr_pool_t *root;
    apr_pool_initialize();//初始化全局分配子(allocator),并为它设置mutext,以用于多线程环境,初始化全局池,指定全局分配子的owner是全局池
    apr_pool_create(&root,NULL);//创建根池(默认父池是全局池),根池生命期为进程生存期。分配子默认为全局分配子
    {
        apr_pool_t *child;
        apr_pool_create(&child,root);//创建子池,指定父池为root。分配子默认为父池分配子
        void *pBuff=apr_palloc(child,sizeof(int));//从子池分配内存
      
        apr_pool_destroy(child);//释放子池,将内存归还给分配子
    }
    apr_pool_destroy(root);//释放父池,
    apr_pool_terminate();//释放全局池,释放全局allocator,将内存归还给系统
 getchar();
    return 1;
}
环境变量设置如何
1). export LD_LIBRARY_PATH=/usr/local/apr/lib
 
 2). -I/usr/local/apr/include/apr-1
 
 3). -lapr-1
  gcc -o test test.c -D_LARGEFILE64_SOURCE -I/usr/local/apr/include/apr-1 -L/usr/local/apr/lib -lapr-1
全部编译选项
-g -O2 -pthread -luuid -lrt -lcrypt -lpthread -ldl -L/usr/local/apr/lib -lapr-1
上一篇:apache 模块的调试
下一篇:ie8 non-admin 安装控件