我试图编译一个c程序,同时链接apr库。
我收到以下错误消息:
c c-g-wall-pthread-i/usr/local/apr/include/apr-1-i/usr/local/apr/include/apr-util-1-l/usr/local/apr/lib-l.aprutil-1-l.apr-1 devpkg.c bstrlib.o db.o shell.o commands.o-o devpkg
/tmp/cczc53x5.o:在函数“main”中:
/home/yotam/dropbox/development/c/devpkg/devpkg.c:14:未定义对“apr_pool_initialize”的引用
/home/yotam/dropbox/development/c/devpkg/devpkg.c:15:未定义对“apr_pool_create_ex”的引用
/home/yotam/dropbox/development/c/devpkg/devpkg.c:29:未定义对“apr_getopt_init”的引用
/home/yotam/dropbox/development/c/devpkg/devpkg.c:31:未定义对“apr_getopt”的引用
db.o:在函数“db_init”中:
/home/yotam/development/c/devpkg/db.c:89:对“apr_pool_initialize”的未定义引用
/home/yotam/development/c/devpkg/db.c:90:未定义对“apr_pool_create_ex”的引用
/home/yotam/development/c/devpkg/db.c:93:对“apr_dir_make_recursive”的未定义引用
/home/yotam/development/c/devpkg/db.c:105:未定义对“apr_pool_destroy”的引用
/home/yotam/development/c/devpkg/db.c:109:未定义对“apr_pool_destroy”的引用
shell.o:在函数“shell_exec”中:
/home/yotam/development/c/devpkg/shell.c:16:未定义对“apr_pool_create_ex”的引用
/home/yotam/development/c/devpkg/shell.c:38:未定义对“apr_pool_destroy”的引用
/home/yotam/development/c/devpkg/shell.c:44:未定义对“apr_pool_destroy”的引用
shell.o:在函数“shell_run”中:
/home/yotam/development/c/devpkg/shell.c:55:未定义对“apr_procattr_create”的引用
/home/yotam/development/c/devpkg/shell.c:58:未定义对“apr_procatr_io_set”的引用
/home/yotam/development/c/devpkg/shell.c:62:未定义对“apr_procattr_dir_set”的引用
/home/yotam/development/c/devpkg/shell.c:65:未定义对“apr_procattr_cmdtype_set”的引用
/home/yotam/development/c/devpkg/shell.c:68:未定义对“apr_proc_create”的引用
/home/yotam/development/c/devpkg/shell.c:71:未定义对“apr_proc_wait”的引用
commands.o:在函数“command\u fetch”中:
/home/yotam/development/c/devpkg/commands.c:44:对“apr-uri-parse”的未定义引用
/home/yotam/development/c/devpkg/commands.c:48:对“apr\u fnmatch”的未定义引用
/home/yotam/development/c/devpkg/commands.c:51:对“apr\u fnmatch”的未定义引用
/home/yotam/development/c/devpkg/commands.c:70:未定义对“apr\u fnmatch”的引用
/home/yotam/development/c/devpkg/commands.c:78:对“apr_dir_make_recursive”的未定义引用
/home/yotam/development/c/devpkg/commands.c:84:未定义对“apr\u fnmatch”的引用
/home/yotam/development/c/devpkg/commands.c:90:对“apr_dir_make_recursive”的未定义引用
错误2:LD返回1退出状态
make:**[devpkg]错误1
这是我的makefile,它应该能够在不同的计算机上编译,其中PREFIX变量是相对于计算机的位置。
(这个程序本质上应该有一天可以移植到任何操作系统上。现在我只想能够成功地编译它)
前缀?=/usr/本地
ldflags=-l${prefix}/apr/lib-l.aprutil-1-l.apr-1
cflags=-g-wall-pthread-i${prefix}/apr/include/apr-1-i${prefix}/apr/include/apr-util-1
全部:devpkg
devpkg:bstrlib.o db.o shell.o命令.o
安装:全部\
安装-d$(destdir)/$(前缀)/bin/\
安装devpkg$(destdir)/$(prefix)/bin/
干净:
客房-F*.O\
RM-F设备\
rm-射频*.dsym
我自己在文件夹里找过,这就是我得到的:
yotam@yotam-hp-probook-450://usr$grep-r apr_pool_initialize。
./local/apr/include/apr-1/apr_pools.h:apr_declare(apr_status_t)apr_pool_initialize(void);
二进制文件./local/apr/lib/libapr-1.so.0.4.6匹配
二进制文件./local/apr/lib/libapr-1.a匹配
二进制文件./local/apr/lib/libapr-1.so.0.5.1匹配
二进制文件./local/apr/lib/libapr-1.so.0.4.5匹配
./local/apr/lib/apr.exp:apr_pool_初始化
在研究之后,我明白这是一个链接器的问题。但我找不到做这个把戏的命令。
提前谢谢。

最佳答案

看起来您缺少link选项,该选项告诉cc要链接哪个库。我不确定.aprutil-1.apr-1在您的LDFLAGS宏中是什么,因为您使用-l指定它们,我将假定它们是目录。
但是,如果您更改行以添加-l选项来指定库,它应该会使您更接近。
编辑:由于链接器是一个单通道工具,所有库都需要列在对象之后,因此符号不会被优化掉。LDLIBS是指定库的宏的典型名称,您可以将它们附加到compile/link命令的末尾,它应该可以工作。

LDFLAGS= -L${PREFIX}/apr/lib -L .aprutil-1 -L .apr-1
LDLIBS=  -lapr-1 -laprutil-1

最后两个参数告诉链接器要使用哪个库名称(以lib开头,以.a结尾)。-L选项指定要搜索库的其他目录,实际上不包含任何内容。
或者,也可以将LD_LIBRARY_PATH设置为指向库目录。
如果您需要更多的调试帮助,可以参考this site(除其他外)。

关于c - 使无法找到功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29288248/

10-11 15:38