链接错误:对未在单独文件中定义的函数的未定义引用?

时间:2014-11-08 18:44:44

标签: c makefile

我可能忘记了一些可以解决这个问题的明显事实。虽然在同一问题上有关于SO的其他问题,但没有一个解决方案适用于我的情况。

我有一个主文件,sim.c,一个头文件net.h,一个头文件friends.h,以及一个带有函数net.c的文件。我有一个makefile,我用gmakemake创建了> Makefile,其内容非常基础。

Header.mak(makefile template):

CFLAGS = -Wall -Wextra -pedantic -std=c99 -ggdb
LFLAGS = -ggdb
LDFLAGS =

Makefile相关内容:

CPP_FILES =
C_FILES =       net.c sim.c
PS_FILES =
S_FILES =
H_FILES =       net.h friends.h
SOURCEFILES =   $(H_FILES) $(CPP_FILES) $(C_FILES) $(S_FILES)
.PRECIOUS:      $(SOURCEFILES)
OBJFILES =

#
# Main targets
#

all:    net sim

net:       net.o $(OBJFILES)
        $(CC) $(CFLAGS) -o net net.o $(OBJFILES) $(CLIBFLAGS)

sim:       sim.o $(OBJFILES)
        $(CC) $(CFLAGS) -o sim sim.o $(OBJFILES) $(CLIBFLAGS)

#
# Dependencies
#

net.o:     net.h
sim.o:     net.h

我的sim.c文件包含:

#include "net.h"
#include "friends.h"

我的头文件包含net.c中的函数,并将它们全部定义为存根。我复制并粘贴它们来创建函数标题,所以不应该有任何拼写错误。

我的net.c文件包含:

#include "net.h"

然而,只要sim.c中的某个函数试图在net.c中调用一个函数,它就会在该行上出错:

"undefined reference to `function_name`".

如何让sim.c能够访问net.c中的函数?

2 个答案:

答案 0 :(得分:1)

对于这两个功能,“看到”彼此确保:

  1. 两个c / cpp文件都包含在makefile
  2. 定义(c / cpp)和声明(h)文件包含相同的函数定义:name / params / return value
  3. 被调用的函数不能是静态的。
  4. 确保您未在​​源文件中声明(或包含)具有不同结构的相同类型。
  5. 应该这样做,除非你使用的是一个非常古老的编译器,其中包含更多可能出错的邪恶事件;)

答案 1 :(得分:1)

消息undefined reference to 'function_name'表示您为链接器提供的所有目标文件, none 中的function_name定义了function_name。这意味着要么

  • 您没有使用net.o
  • 进行关联
  • net.c(已编译)不包含net.c定义 - 由编译后的'我的意思是你使用的所有各种预处理器选项。

既然您既没有显示链接命令行也没有显示sim的内容,我们无法确定问题所在。

修改

通过编辑,我们可以清楚地看到您遇到了第一个问题 - 当您尝试链接net.o时,您不会在链接命令行中包含sim。最常见的是,您可以将sim: sim.o net.o $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LDLIBS) 与makefile条目链接起来,如:

sim: sim.o net.o

或更简单地说:

{{1}}

依赖于链接目标文件的默认make动作