C Make无法找到函数

C Make无法找到函数,c,linux,shell,makefile,apr,C,Linux,Shell,Makefile,Apr,我正在尝试编译一个C程序,同时链接APR库。 我收到以下错误消息: cc -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: In funct

我正在尝试编译一个C程序,同时链接APR库。 我收到以下错误消息:

cc -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: In function `main': /home/yotam/Dropbox/Development/C/devpkg/devpkg.c:14: undefined reference to `apr_pool_initialize' /home/yotam/Dropbox/Development/C/devpkg/devpkg.c:15: undefined reference to `apr_pool_create_ex' /home/yotam/Dropbox/Development/C/devpkg/devpkg.c:29: undefined reference to `apr_getopt_init' /home/yotam/Dropbox/Development/C/devpkg/devpkg.c:31: undefined reference to `apr_getopt' db.o: In function `DB_init': /home/yotam/Development/C/devpkg/db.c:89: undefined reference to `apr_pool_initialize' /home/yotam/Development/C/devpkg/db.c:90: undefined reference to `apr_pool_create_ex' /home/yotam/Development/C/devpkg/db.c:93: undefined reference to `apr_dir_make_recursive' /home/yotam/Development/C/devpkg/db.c:105: undefined reference to `apr_pool_destroy' /home/yotam/Development/C/devpkg/db.c:109: undefined reference to `apr_pool_destroy' shell.o: In function `Shell_exec': /home/yotam/Development/C/devpkg/shell.c:16: undefined reference to `apr_pool_create_ex' /home/yotam/Development/C/devpkg/shell.c:38: undefined reference to `apr_pool_destroy' /home/yotam/Development/C/devpkg/shell.c:44: undefined reference to `apr_pool_destroy' shell.o: In function `Shell_run': /home/yotam/Development/C/devpkg/shell.c:55: undefined reference to `apr_procattr_create' /home/yotam/Development/C/devpkg/shell.c:58: undefined reference to `apr_procattr_io_set' /home/yotam/Development/C/devpkg/shell.c:62: undefined reference to `apr_procattr_dir_set' /home/yotam/Development/C/devpkg/shell.c:65: undefined reference to `apr_procattr_cmdtype_set' /home/yotam/Development/C/devpkg/shell.c:68: undefined reference to `apr_proc_create' /home/yotam/Development/C/devpkg/shell.c:71: undefined reference to `apr_proc_wait' commands.o: In function `Command_fetch': /home/yotam/Development/C/devpkg/commands.c:44: undefined reference to `apr_uri_parse' /home/yotam/Development/C/devpkg/commands.c:48: undefined reference to `apr_fnmatch' /home/yotam/Development/C/devpkg/commands.c:51: undefined reference to `apr_fnmatch' /home/yotam/Development/C/devpkg/commands.c:70: undefined reference to `apr_fnmatch' /home/yotam/Development/C/devpkg/commands.c:78: undefined reference to `apr_dir_make_recursive' /home/yotam/Development/C/devpkg/commands.c:84: undefined reference to `apr_fnmatch' /home/yotam/Development/C/devpkg/commands.c:90: undefined reference to `apr_dir_make_recursive' collect2: error: ld returned 1 exit status make: *** [devpkg] Error 1 我已经亲自在文件夹中搜索了它,我得到的是:

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); Binary file ./local/apr/lib/libapr-1.so.0.4.6 matches Binary file ./local/apr/lib/libapr-1.a matches Binary file ./local/apr/lib/libapr-1.so.0.5.1 matches Binary file ./local/apr/lib/libapr-1.so.0.4.5 matches ./local/apr/lib/apr.exp:apr_pool_initialize yotam@yotam-HP-ProBook-450://usr$grep-r apr\u pool\u初始化。 /local/apr/include/apr-1/apr\u pool.h:apr\u DECLARE(apr\u status)apr\u pool\u 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\u pool\u初始化 在我做了研究之后,我清楚地了解到这是一个链接器问题。但是我找不到做这个把戏的命令


提前感谢。

看起来您缺少了链接选项,该选项告诉
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
设置为指向您的库目录


如果您需要更多的调试帮助,您可以(除其他外)咨询作为参考。

看起来您缺少了告诉
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
设置为指向您的库目录


如果您需要更多调试帮助,您可以参考(以及其他)作为参考。

尝试用LDLIBS替换LDFLAGS,如:

LDLIBS=-L${PREFIX}/apr/lib -lapr-1 -pthread -laprutil-1
而不是:

LDFLAGS=-L${PREFIX}/apr/lib -lapr-1 -pthread -laprutil-1

这是因为LDFLAGS变量用于链接器的非库选项,而在本例中,您使用的是库。

请尝试用LDLIBS替换LDFLAGS,如下所示:

LDLIBS=-L${PREFIX}/apr/lib -lapr-1 -pthread -laprutil-1
而不是:

LDFLAGS=-L${PREFIX}/apr/lib -lapr-1 -pthread -laprutil-1

这是因为LDFLAGS变量用于链接器的非库选项,而在本例中,您使用的是库。

我想应该省略“-L.aprutil-1”和“-L.apr-1”,因为两个lib都在apr/lib中,并且该目录已经通过第一个-L参数添加到链接器路径中。@nimrodm是的,这也是我的假设,但因为我不确定,我把它们放在里面了。他可能在使用点链接…只是尝试了一下,但没有成功。然而,-L。这个选项是我后来尝试过的,看起来和我以前做的一样。没有明显的迹象change@YotamAlon尝试使用带-L选项的那些lib的显式路径,然后重试。我不确定
${PREFIX}
正在解析什么。这是相对于源目录的位置吗?用你的尝试和结果更新问题。非常感谢你们!!!我已经为此奋斗了一个星期!我能够编译并运行它(有错误,但那是我的错)。如果你什么时候来以色列,我会邀请你喝杯啤酒。我想“-L.aprutil-1”和“-L.apr-1”可能应该省略,因为两个lib都在apr/lib中,并且该目录已经通过第一个-L参数添加到链接器路径中。@nimrodm是的,这也是我的假设,但因为我不确定,我把它们留在了。他可能在使用点链接…只是尝试了一下,但没有成功。然而,-L。这个选项是我后来尝试过的,看起来和我以前做的一样。没有明显的迹象change@YotamAlon尝试使用带-L选项的那些lib的显式路径,然后重试。我不确定
${PREFIX}
正在解析什么。这是相对于源目录的位置吗?用你的尝试和结果更新问题。非常感谢你们!!!我已经为此奋斗了一个星期!我能够编译并运行它(有错误,但那是我的错)。如果你什么时候来以色列,我就请你喝杯啤酒。