2013-10-14 77 views
1

我有一個關於C編程語言的新手問題。我曾四處尋找類似問題的答案,但我未能弄明白。從另一個目錄中的源文件調用方法

假設一個由兩個目錄組成的簡單項目:src和test。源文件和頭文件由src/main.c,test/foo.h和test/foo.c定義。

SRC/main.c中:

#include "../test/foo.h" 

int main (void) { 
    int a = VAR; /* works, recognizes declared macro */ 
    some_function(a); /* doesn't work, "undefined reference" */ 
} 

測試/ foo.h中:

#ifndef FOO_H 
#define FOO_H 

void some_function(int a);  
#define VAR 2; 

#endif 

測試/ foo.c的(多餘的,但是完整的):

#include "foo.h" 
#include <stdlib.h> 

void some_function(int a) { 
    printf("%d", ++a); 
} 

我在Eclipse中創建了項目,並且我也編譯了它,我認爲它不是鏈接錯誤,因爲宏被識別,但該方法不可調用。

我之所以使用不同的目錄是因爲我有很多文件,並希望我的測試代碼與我的主要源代碼分開。請注意,src和test具有相同的父目錄。

任何想法這裏發生了什麼?我錯過了非常明顯的東西嗎?

任何幫助將不勝感激,在此先感謝!

編輯:我正在使用(Debian)Linux機器,Eclipse使用gcc編譯器。

edit2:感謝H2CO3的回答我知道這確實是一個鏈接錯誤。由於每次手動編譯和鏈接都是相當的開銷,我想知道是否有人知道如何教Eclipse來鏈接來自不同目錄的可執行文件?

--------------------- SOLUTION ---------------------

edit3:大聲笑的解決方案是非常容易的,畢竟,我只需要創建一個「新的源文件夾」而不是「新文件夾」。我感到很蠢,但是要感謝大家回覆,特別是H2CO3!

+0

嘗試從'main.c' =>'#include「../test/foo.c中包含實際源文件「 – Cyclonecode

+1

@KristerAndersson *** NO NO NO NO NO NOOOOOOO *** – 2013-10-14 20:50:29

+0

@ H2CO3 - 這不行嗎? – Cyclonecode

回答

2

我想這不是一個鏈接錯誤,因爲宏被識別,但該方法是不可調用的。

非sequitur。宏在預處理階段被擴展。 (因此,它們與鏈接完全無關。)您確實有鏈接器錯誤。

,你所要做的就是編譯這兩個文件,然後將它們關聯起來,所以這樣的事情應該工作:

gcc -Wall -o dir_one/foo.o dir_one/foo.c 
gcc -Wall -o dir_two/bar.o dir_two/bar.c 
gcc -o my_program dir_one/foo.o dir_two/bar.o 

此外,閱讀this SO question/answer和/或this article瞭解編譯過程中如何步驟一起工作。 (這些對於C和C++來說幾乎是一樣的,它只是通常不同的名稱)

+0

感謝您的回覆,它似乎正在工作。但是,每次運行測試時都必須編譯兩個目錄中的所有文件都非常昂貴,我想我的後續問題是如何在Eclipse中設置此鏈接行爲。我不指望你回答這個問題,因爲你可能使用你的命令行或腳本來進行鏈接和編譯。但是,感謝您的回覆,它在鏈接過程中給了我一些新的見解! – ShellFish

+0

順便說一句如果沒有人可以幫助我在Eclipse中鏈接這些文件,我一定會將您的答案作爲最有用的答案! – ShellFish

+0

謝謝你,你救了我幾個小時的挫折! – ShellFish

相關問題