【发布时间】: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