包含头文件时未定义的引用
问题描述:
当我包含头文件时出现错误,但如果包含源文件则不会。包含头文件时未定义的引用
的功能是这样的源文件中定义:
/* 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.
任何想法,为什么这可能是?
答
#include
表示包含的文件被复制到源文件中。 因此,当你包含你的.c文件时,函数的代码就在这里,它可以工作。 如果你只包含头文件,这很好,这是因为你的函数会相互认识,至少现在他们会存在,但他们需要他们的代码一起工作,所以你现在需要将你的两个files.c一起编译,不是一个一个。 也许你正在编译自己:
gcc file1.c file2.c
或使用IDE,你必须调整编译选项。 如果你想分离地编译C文件,你必须在目标文件中编译它们(带有gcc的-c选项),然后链接它们。
你说得对,我的代码很完善,但是我没有正确配置链接器。谢谢! – ridthyself