2017-05-27 26 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

相关问题