2017-05-27 29 views
0

當我包含頭文件時出現錯誤,但如果包含源文件則不會。包含頭文件時未定義的引用

的功能是這樣的源文件中定義:

/* in User.c */ 

struct User { 
    const char* name; 
}; 

struct User* addedUser(const char* name) { 
    struct User* user = malloc(sizeof(struct User)); 
    user->name = name; 
    return user; 
} 

而且像這樣使用:

/* in main.c */ 

int test_addedUser() { 
    char* newName = "Fooface"; 
    struct User* newUser = addedUser(newName); 
    assert(!strcmp(newName, newUser->name)); 
    return 0; 
} 

這個偉大的工程。當我#include「User.c」時,我可以調用test_addUser而不會出現問題。

不過,我想#包括「User.h」來代替,這是位於同一目錄:

/* in User.h */ 

struct User { 
    const char* name; 
}; 

struct User* addedUser(const char*); 

但是,如果我#包括「User.h」,而不是user.c的,我得到一個錯誤:

CMakeFiles/run_tests.dir/src/tests.c.o: In function `test_addedUser': 
/home/rid/port/src/tests.c:(.text+0x4eb): undefined reference to `addedUser' 

似乎很奇怪,我認爲包括源文件user.c的時候參考的作品很好,但它是無法調和User.h.

任何想法,爲什麼這可能是?

回答

2

#include表示包含的文件被複制到源文件中。 因此,當你包含你的.c文件時,函數的代碼就在這裏,它可以工作。 如果你只包含頭文件,這很好,這是因爲你的函數會相互認識,至少現在他們會存在,但他們需要他們的代碼一起工作,所以你現在需要將你的兩個files.c一起編譯,不是一個一個。 也許你正在編譯自己:

gcc file1.c file2.c 

或使用IDE,你必須調整編譯選項。 如果你想分離地編譯C文件,你必須在目標文件中編譯它們(帶有gcc的-c選項),然後鏈接它們。

+0

你說得對,我的代碼很完善,但是我沒有正確配置鏈接器。謝謝! – ridthyself

相關問題