c - ld 和静态库 "undefined reference to"的问题

标签 c gcc makefile static-libraries ld

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

我目前正在和 Zed A. Shaw 闲逛 "Learn C the Hard Way"类(class)。我正试图完成练习 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 包含在库中。所以调用 header list.h 应该使 ld 在 build/liblcthw.a 中查找 list.o。问题是 ld 出于某种原因没有读取 build/liblcthw.a。所以我得到了这个 undefined reference 错误。

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

我希望有人能帮助我。

最佳答案

以下是否有效?

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

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

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

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

关于c - ld 和静态库 "undefined reference to"的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15059859/

相关文章:

linux - 对 `dlopen' 的 undefined reference

c++ - 如何使用 gcc 编译 C++ 代码的特定部分

c++ - 无法让 Makefile 工作

c - 在Mac控制台中同时运行2个C程序

c - 指向指针数组的指针指向意外的地址

python - Py_Finalize() 在 Python 出错后崩溃

python - 使用 MinGW+GCC 编译 SciPy 时编译器失败

c - 生成文件错误 : make: *** No rule to make target `omp.h' ; with OpenMP

linux - 如何重新编译现有的 Linux 应用程序

c - 4096 个 float 和 2 个选项哪个是最好的方法,为什么?