2017-05-27 10 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; 
} 

これは素晴らしい作品。私は "User.c"を#includeしても問題なくtest_addUserを呼び出すことができます。

しかし、私は同じディレクトリに配置され、代わりに "User.hを" #includeしたい:私は代わりにUser.cの "User.hを" #includeする場合、

/* in User.h */ 

struct User { 
    const char* name; 
}; 

struct User* addedUser(const char*); 

しかし、 、私はエラーを取得する:

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ファイルをインクルードすると、関数のコードがここにあり、動作します。 ヘッダーファイルのみをインクルードすると、関数が互いに知り合っていること、少なくとも現在は存在するがコードは連携している必要があるので、2つのファイルをコンパイルする必要があります。ひとつひとつではありません。

gcc file1.c file2.c 

するか、IDEで、あなたはコンパイルオプションを調整する必要があります。 はたぶん、あなたは自分でコンパイルしています。 Cファイルを別々にコンパイルする場合は、それらをオブジェクトファイル(-cオプションとgcc)でコンパイルし、それらをリンクする必要があります。

+0

あなたは正しいです、私のコードは健全でしたが、リンカーを正しく構成していませんでした。ありがとう! – ridthyself