我正在处理一个实现一些通用容器的C项目,在编译时遇到了这个奇怪的问题。下面是一些同样复制错误的示例代码。
foo.h
void fooprint(void);
foo.c
#include "foo.h"
#include <stdio>
void fooprint(void){
printf("bar");
return;
}
main.c
#include "foo.h"
int main(void){
fooprint();
return 0;
}
我通过键入进行编译
gcc main.c -o main
这就是终端输出的
Undefined symbols:
"_fooprint", referenced from:
_main in ccfMXGzj.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
我在OSX系统上编译,但也尝试过在红帽子机器上编译,效果也一样。
解决方案可能是显而易见的,但我有很多朋友在研究这个问题,他们看不出问题所在。我在谷歌上搜索了很多,但大多数符号错误问题通常与目标C有关。
您需要将它们一起编译:
gcc -Wall -Wextra -o main main.c foo.c
或者制作一个Makefile?
all: main
main: main.o foo.o
main.o: main.c
foo.o: foo.c
您还必须将foo.c
编译到一个对象文件中,并将所有这些文件链接在一起:
gcc -o foo.o foo.c
gcc -o main.o main.c
gcc -o main main.o foo.o
是的,这很简单,所以我建议你读一本好的C书,并迈出这些简单的步骤。