2015-04-30 135 views
0

我在我的Geany項目中有一個奇怪的問題。該項目非常簡單,包含3個文件,全部位於同一目錄中:main.cfoo.hfoo.cGeany項目包括編譯器錯誤

編譯器錯誤:

In file included from main.c:1:0: 
foo.h:4:12: warning: ‘bar’ used but never defined 
static int bar(void); 
      ^
/tmp/cc0zCvOX.o: In function `main': 
main.c:(.text+0x12): undefined reference to `bar' 
Compilation failed. 
collect2: error: ld returned 1 exit status 

到底哪裏出問題了?

的main.c:

#include "foo.h" 

int main(int argv, char* argc[]) 
{ 
    bar(); 
    return 0; 
} 

了foo.h:

#ifndef _FOO_H_ 
#define _FOO_H_ 

static int bar(void); 

#endif // _FOO_H_ 

foo.c的:

#include "foo.h" 

#include <stdio.h> 

static int bar(void) 
{ 
    printf("Hello World\n"); 
    return 1; 
} 
+0

項目不包括gcc的正確調用。請更新Build-> Set Build命令和/或考慮使用makefile。您首先要編譯foo.c並將其設爲目標文件,而不是編譯main.c.也許預編譯foo.c的命令對你來說效果不錯,但是你必須證明它。 – frlan

回答

1

如果一個函數聲明爲static,功能文件範圍,表示該功能的範圍僅限於翻譯單元(在本例中爲源文件)。存在於同一編譯單元中的其他函數可以調用函數,但編譯單元外部不存在的函數可以看到定義(存在)或調用函數。

相關:從C11標準文檔,章,標識符

If the declaration of a file scope identifier for an object or a function contains the storage class specifier static , the identifier has internal linkage.(30)

和,腳註(30)的聯動,

A function declaration can contain the storage-class specifier static only if it is at file scope;

解決方案:在函數定義和聲明刪除static

FWIW,將static函數的前向聲明放在頭文件中沒有太多意義。無論如何,static函數不能從其他源文件中調用。

+0

我已經刪除了'static',它仍然會提示未定義的參考欄。有趣的是,如果我將bar的定義移動到foo.h(來自foo.c),它會進行編譯。這意味着foo.c不包括在Geany項目中嗎? –

+0

@JakeM也從頭文件中刪除'static'。而且你沒有在頭文件中定義函數。也許在這種情況下,你是對的,出於某種原因,'foo.c'沒有被編譯並且與'main.c'鏈接。請檢查。 –

+0

我已經從兩個文件中刪除了'static'。你如何將foo.c添加到Geany項目中?我google了這個和一個stackoverflow答案說你不需要自動鏈接,但也許這是不正確的? –