包含头文件时的未定义引用

时间:2017-05-27 01:35:29

标签: c reference linker header undefined

当我包含头文件时出错,但如果我包含源文件则不会。

该函数在源文件中定义如下:

/* 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。

但是,我想#include" User.h"相反,它位于同一目录中:

/* in User.h */

struct User {
    const char* name;
};

struct User* addedUser(const char*);

但是,如果我#include" 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。

为什么会出现这种情况?

1 个答案:

答案 0 :(得分:5)

#include表示包含的文件被复制到源文件中。 因此,当您包含.c文件时,函数的代码就在这里并且它可以工作。 如果你只包含头文件,那很好,因为你的函数会相互了解,至少它们现在会存在但是它们需要它们的代码一起工作,所以你现在需要将两个files.c一起编译,而不是逐一。 也许你自己在编译:

gcc file1.c file2.c

或者使用IDE,您必须调整编译选项。 如果要分别编译C文件,则必须在目标文件中编译它们(使用gcc的-c选项),然后链接它们。