以这种方式使用头文件给了我错误"对somefunc"的未定义引用。确保看到somefunc.c
的正确方法是什么,所以这个错误不会发生?似乎只在somefile.h
中包含main.c
并不足以查看somefile.c
的main.c
#include "somefile.h"
int main() {
somefunc();
return 0;
}
somefile.h
#ifndef SOMEFILE_H
#define SOMEFILE_H
void somefunc();
#endif
somefile.c
#include <stdio.h>
#include "somefile.h"
void somefunc() {
printf("hello\n");
}
我不明白为什么我会收到错误,因为这与他在寻找答案时一直在查看的教程和视频中的使用方式相同。上面的代码是前面给出的答案,但它仍然有相同的错误。
答案 0 :(得分:4)
对somefunc
的未定义引用是链接器错误,而不是编译器错误。
这意味着,虽然在编译main.c
标题somefile.h
时,您没有与somefile.c
一起编译文件main.c
。因此,当链接发生时,链接器无法在任何目标文件中找到somefunc
的实现来解析来自main()
的调用。
如果您正在使用GCC或Clang,只需将两个源文件编译为您的命令,例如
gcc somefunc.c main.c -o output
如果您使用的是IDE,请确保在构建应用程序时somefile.c
与main.c
一起编译。
答案 1 :(得分:2)
这似乎不是头文件的问题。
这似乎是链接中的问题,这取决于您如何构建项目。如果使用IDE,则意味着somefile.c未包含在项目中。如果您正在使用make和makefile,则意味着somefile.c未在makefile中列出,或者至少不包含在链接器中。如果你在命令行构建(不是使用make或某些构建工具,而是使用gcc),那么你不会在命令中包含somefile.c。
未定义的引用错误意味着链接器无法在somefile.c中找到代码,因为链接器不知道包含它。