我可能忘记了一些可以解决这个问题的明显事实。虽然在同一问题上有关于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中的函数?
答案 0 :(得分:1)
对于这两个功能,“看到”彼此确保:
应该这样做,除非你使用的是一个非常古老的编译器,其中包含更多可能出错的邪恶事件;)
答案 1 :(得分:1)
消息undefined reference to 'function_name'
表示您为链接器提供的所有目标文件, none 中的function_name
定义了function_name
。这意味着要么
net.c
的定义 - 由编译后的'我的意思是你使用的所有各种预处理器选项。既然您既没有显示链接命令行也没有显示sim
的内容,我们无法确定问题所在。
修改强>
通过编辑,我们可以清楚地看到您遇到了第一个问题 - 当您尝试链接net.o
时,您不会在链接命令行中包含sim
。最常见的是,您可以将sim: sim.o net.o
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LDLIBS)
与makefile条目链接起来,如:
sim: sim.o net.o
或更简单地说:
{{1}}
依赖于链接目标文件的默认make动作