ld和静态库“未定义引用”的问题

时间:2013-02-25 03:58:25

标签: c gcc makefile static-libraries ld

这个有点尴尬。我知道发生了什么,但不知道为什么。我得到一个“未定义的引用”错误,这意味着链接器(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是启用“all”警告,-Wextra是启用更多警告,-Isrc包含src目录到库目录,-o tests / list_tests是产生一个在该目录中使用该名称输出,-DNDEBUG用于启用代码中的变量,-O2用于级别2优化(无论这意味着什么)和构建/ liblcthw.a以包含该库(正在构建的库)。其余的我不知道他们做了什么。

如果我说得对,那么src目录中的list.c会创建一个对象list.o.该对象稍后包含在lib via ar和ranlib中。所以调用header list.h应该让ld在build / liblcthw.a中查找list.o.事情是由于某种原因ld没有读取build / liblcthw.a。所以我得到了这个未定义的错误引用。

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

我希望有人可以帮助我。

2 个答案:

答案 0 :(得分:6)

以下是否有效?

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

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

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

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

答案 1 :(得分:0)

您只需编写

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

当我返回-ld错误时,我运行了此命令 对我有用