2016-06-24 88 views
0

以下步骤从herehere我尝试使用apr 1.5.2和apr-utils 1.5.4编译一个简单的程序。这里是程序的代码:编译简单的Apache Portable Runtime 1.5.2程序

#include <apr.h> 
    #include <stdlib.h> 

    int main(int argc, char *argv[]) { 
     apr_pool_t *pool; 
     apr_file_t *out; 

     apr_initialize(); 
     atexit(apr_terminate()); 

     apr_pool_create(&pool, NULL); 
     apr_file_open_stdout(&out, pool); 

     apr_file_printf(out, "Hello World\n"); 

     apr_pool_destroy(pool); 
     return EXIT_SUCCESS; 
    } 

现在,当我尝试使用下面的Makefile编译它时,编译器会返回错误。

的Makefile:

PREFIX?=/usr/local/apr 
    CFLAGS=-g -Wall -I${PREFIX}/include/apr-1 
    LDFLAGS=-L${PREFIX}/apr/lib -lapr-1 -pthread -laprutil-1 
    CC=clang 

    .PHONY: all clean 
    all: hello 

    clean: 
      rm -f *.o 

编译器输出:

$ make 
clang -g -Wall -I/usr/local/apr/include/apr-1 -L/usr/local/apr/apr/lib -lapr-1 -pthread -laprutil-1 hello.c -o hello 
hello.c:5:5: error: use of undeclared identifier 'apr_pool_t' 
    apr_pool_t *pool; 
    ^
hello.c:5:17: error: use of undeclared identifier 'pool' 
    apr_pool_t *pool; 
       ^
hello.c:6:5: error: unknown type name 'apr_file_t'; did you mean 'apr_size_t'? 
    apr_file_t *out; 
    ^~~~~~~~~~ 
    apr_size_t 
/usr/local/apr/include/apr-1/apr.h:356:26: note: 'apr_size_t' declared here 
typedef size_t   apr_size_t; 
         ^
hello.c:8:5: warning: implicit declaration of function 'apr_initialize' is 
     invalid in C99 [-Wimplicit-function-declaration] 
    apr_initialize(); 
    ^
hello.c:9:12: warning: implicit declaration of function 'apr_terminate' is 
     invalid in C99 [-Wimplicit-function-declaration] 
    atexit(apr_terminate()); 
     ^
hello.c:9:12: warning: incompatible integer to pointer conversion passing 'int' 
     to parameter of type 'void (*)(void)' [-Wint-conversion] 
    atexit(apr_terminate()); 
      ^~~~~~~~~~~~~~~ 
/usr/include/stdlib.h:519:27: note: passing argument to parameter '__func' here 
extern int atexit (void (*__func) (void)) __THROW __nonnull ((1)); 
         ^
hello.c:11:5: warning: implicit declaration of function 'apr_pool_create' is 
     invalid in C99 [-Wimplicit-function-declaration] 
    apr_pool_create(&pool, NULL); 
    ^
hello.c:11:22: error: use of undeclared identifier 'pool' 
    apr_pool_create(&pool, NULL); 
        ^
hello.c:12:5: warning: implicit declaration of function 'apr_file_open_stdout' 
     is invalid in C99 [-Wimplicit-function-declaration] 
    apr_file_open_stdout(&out, pool); 
    ^
hello.c:12:32: error: use of undeclared identifier 'pool' 
    apr_file_open_stdout(&out, pool); 
          ^
hello.c:13:5: warning: implicit declaration of function 'apr_file_printf' is 
     invalid in C99 [-Wimplicit-function-declaration] 
    apr_file_printf(out, "Hello World\n"); 
    ^
hello.c:14:5: warning: implicit declaration of function 'apr_pool_destroy' is 
     invalid in C99 [-Wimplicit-function-declaration] 
    apr_pool_destroy(pool); 
    ^
hello.c:14:22: error: use of undeclared identifier 'pool' 
    apr_pool_destroy(pool); 
        ^
7 warnings and 6 errors generated. 
make: *** [hello] Error 1 

注意:在这个例子中,我把Makefile文件的,还有一个链接-I${PREFIX}/apr/include/apr-util-1,但安装APR-utils的没创建这个文件夹。

回答

0

<apr.h>表头用于platform definitions。它定义了APR(具有WinAPI?具有OpenSSL?)和标准数据类型(apr_byte_tapr_uint32_t等)可用的功能。它在生成过程中自动生成./configure

对于内存池和文件IO,您需要包含的分别是apr_pools.hapr_file_io.h

更多atexit(3)需要一个函数指针,并且你传递了一个函数。相反,它应该说:

atexit(apr_terminate); 

这样的错误,这些很容易在自己的调试。当编译器抱怨你正在使用的库中有一个未声明的标识符时,你几乎肯定会忘记包含适当的头文件。

+0

谢谢,它的工作!我还必须添加apr_general.h并删除链接器选项-laprutil-1。 – Sergey

+0

@Sergey很高兴它帮助你,欢迎来到SO!如果答案适合您,您可以勾选左侧的复选标记将其标记为已接受。 – a3f