A.c (main函数)
#include "B.h"
int main(void) {
//内容
return 1;
}
B.c
#include "B.h"
void func_b() {
//内容
}
B.h
#ifndef B_H_
#define B_H_
//头文件内容
void func_b();
#endif
注:B_H_ 是规范的写法,_B_H 不是规范写法,因为c库内置的定义都是下划线开头的,用户定义的头文件不应该以下划线开头
好了,我们编译一下(Linux 下的可执行文件可以没有后缀名,而 Windows 下的可执行文件需要 exe 后缀,即 A.exe)
gcc A.c -o A
这时会提示 undefined reference to func_b
为什么呢,我们看一下编译工具预处理后但还没汇编的源码文件
gcc -E A.c -o A.i
这时候你可以看到 A.i 里面的内容,只有 A.c 和 B.h 的内容以及其他链接信息,但没有包含 B.c 的内容。
因为我们的编译命令错了
正确的编译命令
gcc A.c B.c -o A
单文件的编译流程:
hello.c(预处理) -> hello.i(编译) -> hello.s(汇编) -> hello.o(链接) -> hello
gcc -E hello.c -o hello.i //预处理
gcc -S hello.i -o hello.S //编译成汇编码
gcc -c hello.s -o hello.o //汇编成二进制
gcc hello.o -o hello //链接
多文件就要生成多个.o文件,然后用以下命令链接起来
gcc 1.o 2.o 3.o -o hello
当然如果目录里只放需要的文件,也可以使用
gcc *.c -o hello
但是文件多了之后,只放需要的文件就几乎不可能了,何况还有子目录呢
由于文件过多,所以后来人们使用专用的脚本来处理
其中 Makefile Cmake 等是比较受欢迎的
Makefile 的用处,解决已包含头文件但还是 undefined reference to
原文:https://www.cnblogs.com/yucloud/p/Makefile.html