2015-09-28 98 views
0

以這種方式使用頭文件給我錯誤「未定義的引用somefunc」。什麼是確保somefunc.c被看到,所以這種錯誤不會發生的正確方法?這似乎只是包括somefile.hmain.c是不夠的,看到somefile.c如何組織頭文件

的main.c

#include "somefile.h" 
int main() { 
    somefunc(); 
return 0; 
} 

somefile.h

#ifndef SOMEFILE_H 
#define SOMEFILE_H 

void somefunc(); 

#endif 

somefile.c定義

#include <stdio.h> 
#include "somefile.h" 

void somefunc() { 
    printf("hello\n"); 
} 

我不明白我爲什麼會遇到錯誤,因爲這與我在查找答案時查看的教程和視頻中使用的方式相同。上面的代碼是前面給出的答案,但它仍然有相同的錯誤。

+0

可能的[正確使用頭文件]的副本(http://stackoverflow.com/questions/32813896/proper-use-of-header-files) – Olaf

+0

是的我早前在僞代碼中問過,並得到了無關的答案我用實際代碼重新編寫它以使其更清晰 – Rhurac

+0

而且您不能編輯該問題 - 爲什麼? – Olaf

回答

3

未定義的對somefunc的引用是一個鏈接器錯誤,而不是編譯器錯誤。

這意味着,編譯main.csomefile.h被發現的時候,雖然,你是不是有main.c編譯文件somefile.c在一起。所以當鏈接發生時,鏈接器無法在任何目標文件中找到somefunc的實現來解析來自main()的調用。

如果使用GCC或鏘只是兩者的源文件編譯成你的命令,如

gcc somefunc.c main.c -o output 

如果您使用的是IDE,而不是,確保somefile.c是一起main.c構建應用程序時編譯。

+0

非常感謝,這讓我頭疼幾個小時。正是我在找什麼。有沒有辦法區分鏈接器錯誤和編譯器錯誤? – Rhurac

+0

通常,編譯器錯誤通過行號引用源,鏈接器錯誤通常會與「未定義的引用」一起投訴,而不指向源代碼(除了說明什麼模塊調用了缺少的函數 – JVene

2

這似乎不是頭文件的問題。

這似乎是鏈接問題,這取決於您如何構建項目。如果您使用IDE,則意味着該項目中不包含somefile.c。如果您使用make和makefile,則意味着somefile.c未在makefile中列出,或者至少未包含在鏈接器中。如果你正在命令行構建(不使用make或某個構建工具,而使用gcc),那麼你不在命令中包含somefile.c。

未定義的引用錯誤意味着鏈接器無法在somefile.c中找到代碼,因爲鏈接器不知道包含它。