从here和here开始执行以下步骤,我尝试使用apr 1.5.2和apr-utils 1.5.4编译一个简单的程序。这是该程序的代码:
#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编译它时,编译器会返回错误。
生成文件:
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 :(得分:0)
<apr.h>
标题适用于platform definitions。它定义了APR(具有WinAPI?具有OpenSSL?)和标准数据类型(apr_byte_t
,apr_uint32_t
等等)可用的内容。它是在./configure
构建期间自动生成的。
您需要分别为内存池和文件IO包含apr_pools.h
和apr_file_io.h
。
进一步atexit(3)
需要一个函数指针并传入一个函数。相反它应该说:
atexit(apr_terminate);
这些错误很容易自行调试。当编译器抱怨您正在使用的库中存在未声明的标识符时,您几乎肯定忘记包含相应的标题。