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

rid*_*elf 1 c linker reference 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;
}
Run Code Online (Sandbox Code Playgroud)

像这样使用:

/* in main.c */

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

这非常有效.当我#include"User.c"时,我能够毫无问题地调用test_addUser.

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

/* in User.h */

struct User {
    const char* name;
};

struct User* addedUser(const char*);
Run Code Online (Sandbox Code Playgroud)

但是,如果我#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'
Run Code Online (Sandbox Code Playgroud)

我觉得奇怪的是,当包含源文件User.c时,引用工作得很好但是它无法协调User.h.

任何想法为什么会这样?

Gam*_*Gam 6

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

gcc file1.c file2.c
Run Code Online (Sandbox Code Playgroud)

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