2014-11-08 46 views
2

我可能會忘記一些明顯的東西來解決這個問題。雖然對於同樣的問題還有其他問題,但沒有任何解決方案適用於我的情況。鏈接錯誤:未定義對在單獨文件中定義的函數的引用?

我有一個主文件sim.c,一個頭文件net.h,一個頭文件friends.h和一個帶有函數net.c的文件。我有一個makefile,我使用gmakemake> Makefile創建,其內容非常基本。

Header.mak(生成文件模板):

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

消息undefined reference to 'function_name'意味着所有的目標文件的你給的鏈接,none其中0人已經定義爲function_name。這意味着,無論是

  • 你不net.o
  • net.c(如編譯)鏈接不包含定義爲function_name - 由「作爲編制」我的意思是所有的您使用的各種預處理器選項。

由於您既沒有顯示您的鏈接命令行也沒有顯示net.c的內容,我們無法確定哪個是問題。

編輯

與你的編輯,我們可以清楚地看到你的第一個問題 - 當你嘗試鏈接sim,你不包括鏈接命令行上net.o

sim: sim.o net.o 
     $(CC) $(CFLAGS) $(LDFLAGS) -o [email protected] $^ $(LDLIBS) 

以上只是簡單:最常見的是,你會與像Makefile項鍊接sim

sim: sim.o net.o 

依靠缺席行動聯繫起來的目標文件

+1

它實際上是一個領先進入另一個,當我看着它。我錯誤地在net.c中留下了一個無關的主函數,這讓gmakemake混淆爲試圖創建兩個彼此不依賴的獨立可執行文件。感謝您的幫助! – 2014-11-08 19:13:45

1

對於這兩個函數 「看到」 對方確認:

  1. /CPP文件包含在Makefile兩個Ç
  2. 兩個定義(C/CPP)和聲明(H)文件包含函數的定義如下:name/params /返回值
  3. 被調用的函數不能是靜態的。
  4. 確保您不要在源文件中聲明(或包含)具有不同結構的相同類型。

這應該做的,除非你使用的是很舊的編譯器具有更邪惡的事情可能出錯;)