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.
任何想法为什么会这样?
#include表示包含的文件被复制到源文件中.因此,当您包含.c文件时,函数的代码就在这里并且它可以工作.如果你只包含头文件,那很好,因为你的函数会相互了解,至少它们现在会存在,但是它们需要它们的代码一起工作,所以你现在需要将两个files.c一起编译,而不是逐一.也许你自己编译:
gcc file1.c file2.c
Run Code Online (Sandbox Code Playgroud)
或者使用IDE,您必须调整编译选项.如果要分别编译C文件,则必须在目标文件(使用gcc的-c选项)中编译它们,然后链接它们.