【问题标题】:gcc exit with undefined reference to function in header filegcc 退出,未定义对头文件中函数的引用
【发布时间】:2013-07-04 20:52:19
【问题描述】:

我想编译一个小程序,它有一个非常简单的 makefile,但我似乎无法让它工作。也许你可以帮助我。 makefile 有以下目标:

visca-cli: visca-cli.c libvisca_hl.o
    gcc -Wall -o visca-cli visca-cli.c /usr/local/lib/libvisca.so libvisca_hl.o

libvisca_hl.o: libvisca_hl.c
    gcc -Wall -c libvisca_hl.c

我可以成功地“制作 libvisca_hl.o”并创建 .o 文件。但是 'make visca-cli' 失败并显示类似

的错误消息

libvisca_hl.c:(.text+0x468a): 未定义的引用 `VISCA_get_md_disptime'

对于 libvisca.h 中定义的每个函数(这里是 VISCA_get_md_disptime)

以下是来自各种文件的包含部分(省略标准库):

在 visca-cli.c 中:

#include "libvisca.h"
#include "libvisca_hl.h"

在 libvisca_hl.c 中:

#include "libvisca_hl.h"

在 libvisca_hl.h 中:

#include "libvisca.h"

所有用“”引用的包含都存在于我运行 make 和所有源文件所在的本地目录中。没有子文件夹。所以我想问题出在makefile上?任何帮助表示赞赏!

【问题讨论】:

  • 不。包含与链接器错误无关。图书馆可以。您没有链接到包含相关函数的定义(与声明相反)的必需库。
  • OP is 链接到包含定义的库。他/她只是在命令行的错误位置执行此操作。

标签: c gcc include makefile


【解决方案1】:

编译/链接命令行中库和对象的顺序很重要。在您的情况下,您只需要将共享对象放在最后:

gcc -Wall -o visca-cli visca-cli.c libvisca_hl.o /usr/local/lib/libvisca.so

在大多数系统上,/usr/local/lib 已经是标准库搜索路径的一部分,因此您可以进一步简化:

gcc -Wall -o visca-cli visca-cli.c libvisca_hl.o -lvisca

【讨论】:

  • 哦,非常感谢。我已经坐了一整天试图完成这项工作。
猜你喜欢
  • 1970-01-01
  • 2020-12-28
  • 1970-01-01
  • 2015-05-05
  • 1970-01-01
  • 2014-04-05
  • 2013-08-30
  • 2020-11-23
  • 1970-01-01
相关资源
最近更新 更多