【问题标题】:Issues with ld and static library "undefined reference to"ld 和静态库“未定义引用”的问题
【发布时间】:2013-02-10 04:14:49
【问题描述】:

这个有点尴尬。我知道发生了什么,但不知道为什么。我收到“未定义的引用”错误,这意味着链接器 (ld) 没有从我创建的库中放入代码。

我目前正在与 Zed A. Shaw "Learn C the Hard Way" 一起玩。我正在尝试完成练习 32,但我不断收到同样的错误。

在本书中,您开发了一个运行以下命令的 make 文件:

cc -g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG  build/liblcthw.a \
    tests/list_tests.c   -o tests/list_tests

其中 -g 是启用调试信息,-Wall 是启用“所有”警告,-Wextra 是启用更多警告,-Isrc 将 src 目录包含到库目录中,-o tests/list_tests 是产生一个在该目录中使用该名称输出,-DNDEBUG 用于启用代码中的变量,-O2 用于 2 级优化(无论这意味着什么)和 build/liblcthw.a 以包含该库(正在构建的库)。其余的我不知道他们在做什么。

如果我没看错的话,src 目录中有一个 list.c,它创建了一个对象 list.o。该对象稍后通过 ar 和 ranlib 包含在 lib 中。所以调用头文件 list.h 应该让 ld 在 build/liblcthw.a 中查找 list.o。问题是 ld 由于某种原因没有读取 build/liblcthw.a。所以我得到了这个未定义的错误引用。

我曾尝试联系 Zed,但他显然是个大忙人。所以我希望在这里得到帮助。告诉我是否需要添加有关该问题的更多信息。 Here's 到目前为止整个图书馆的链接。

我希望有人可以帮助我。

【问题讨论】:

  • 订单很重要。静态库在命令行中源/目标文件之后。
  • 我没有得到你的推荐
  • 更改命令行参数的顺序。 .c 文件必须在前,.a 文件必须在后。
  • 安全的链接方式是对象文件,然后是库。
  • 确实只是订单!

标签: c gcc makefile static-libraries ld


【解决方案1】:

以下是否有效?

cc -g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG 测试/list_tests.c \ -o 测试/list_tests -Lbuild -llcthw

这样做是使用-l 选项链接库,并使用-L 选项指定链接器应在其中查找库的附加目录。 lib 前缀和.a 后缀不得在-l 参数中指定。

请注意,如果您在“build”目录中还有一个共享库 (*.so),事情就会变得复杂。为简单起见,您应该删除“liblcthw.so”文件并仅保留“liblcthw.a”,或者尝试通过将其列为输入来链接静态库,就像您最初所做的那样,但指定它你的源文件之后:

cc -g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG 测试/list_tests.c \ -o 测试/list_tests 构建/liblcthw.a

【讨论】:

  • 有点的帮助。程序已编译但现在运行时出现此错误“./tests/list_tests: error while loading shared libraries: liblcthw.so: cannot open shared object file: No such file or directory” 是否在库目录中寻找 liblcthw.so ?如果是这样,我该如何避免?
  • @LucianoRobino 是否“build”目录中有“liblcthw.so”文件?因为如果没有,编译命令就会失败。
  • 这不会使用静态库。
  • @n.m.我以为只有一个静态库。
  • 我可以调整这个东西只创建一个静态库而不编译动态库
【解决方案2】:

你可以简单地写

$ gcc -Isrc filename.c -o anyname.o /path/to/direc/archivefile/stored/archivedfile.a

当我收到 -ld 返回的错误时,我运行了这个 它对我有用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 2016-08-04
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    相关资源
    最近更新 更多