【问题标题】:Make is unable to find the functionsmake 找不到函数
【发布时间】:2015-05-31 01:07:53
【问题描述】:

我正在尝试编译 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:在函数“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_procattr_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_fetch”中:
/home/yotam/Development/C/devpkg/commands.c:44:未定义对“apr_uri_parse”的引用
/home/yotam/Development/C/devpkg/commands.c:48:未定义对“apr_fnmatch”的引用
/home/yotam/Development/C/devpkg/commands.c:51:未定义对“apr_fnmatch”的引用
/home/yotam/Development/C/devpkg/commands.c:70:未定义对“apr_fnmatch”的引用
/home/yotam/Development/C/devpkg/commands.c:78:未定义对“apr_dir_make_recursive”的引用
/home/yotam/Development/C/devpkg/commands.c:84:未定义对“apr_fnmatch”的引用
/home/yotam/Development/C/devpkg/commands.c:90:未定义对“apr_dir_make_recursive”的引用
collect2:错误:ld 返回 1 个退出状态
制作:*** [devpkg] 错误 1

这是我的makefile,它应该可以在不同的计算机上编译,其中PREFIX变量是相对于计算机的位置。 (这个程序本质上应该有朝一日可以移植到任何操作系统。现在我只想能够成功编译它)

PREFIX?=/usr/local
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 commands.o

安装:全部\
    安装 -d $(DESTDIR)/$(PREFIX)/bin/ \
    安装 devpkg $(DESTDIR)/$(PREFIX)/bin/

干净的:
    rm -f *.o \
    rm -f 开发包\
    rm -rf *.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_initialize

经过我的研究,我清楚地明白这是一个链接器问题。但我找不到执行此操作的命令。

提前致谢。

【问题讨论】:

    标签: c linux shell makefile apr


    【解决方案1】:

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

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

    代替:

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

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

    【讨论】:

      【解决方案2】:

      看起来您缺少告诉cc 要链接哪个库的链接选项。我不确定.aprutil-1.apr-1 在你的LDFLAGS 宏中是什么,因为你用-L 指定它们,我会假设它们是目录。

      但是,如果您更改行以添加 -l 选项来指定库,它应该让您更接近。

      编辑:因为链接器是单通道工具,所有库都需要在对象之后列出,因此符号不会被优化掉。 LDLIBS 是指定库的宏的典型名称,您可以将它们附加到编译/链接命令的末尾,它应该可以工作。

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

      最后两个参数告诉链接器使用哪个库名称(以 lib 开头并以 .a 结尾)。 -L 选项指定用于搜索库的其他目录,它实际上不包含任何内容。

      或者,您也可以将LD_LIBRARY_PATH 设置为指向您的库目录。

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

      【讨论】:

      • 我猜应该可以省略“-L .aprutil-1”和“-L .apr-1”,因为这两个库都在 apr/lib 中,并且该目录已经添加到第一个 -L 参数的链接器路径。
      • @nimrodm 是的,这也是我的假设,但由于我不确定,所以我把它们留在了里面。他可能正在使用点链接......
      • 刚刚试过了,没用。但是, -L 。选项是我后来尝试过的,似乎它与我之前所做的一样。没有明显的变化
      • @YotamAlon 尝试使用带有 -L 选项的这些库的显式路径,然后重试。我不确定${PREFIX} 正在解决什么问题。这是相对于您的源目录的位置吗?用您尝试的方法和结果更新问题。
      • 非常感谢你们!!!我已经为此奋斗了一周!我能够编译它并且它运行(有错误但这是我的错)。如果你随时来以色列,我会请你喝杯啤酒。
      猜你喜欢
      • 2018-02-07
      • 2013-08-19
      • 2020-05-11
      • 1970-01-01
      • 2019-01-13
      • 2014-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多