多文件程序的编译方法
写一个稍大点的程序,通常不会把所有代码塞进一个文件里。比如你做个小工具,把主函数放在 main.c,把一些通用功能拆到 utils.c,再建个头文件 utils.h 声明函数。这样结构清楚,改起来也方便。
但问题来了:文件多了,怎么一起编译?直接用 gcc main.c 肯定不行,它找不到 utils.c 里的函数。
一次性编译多个源文件
最简单的办法,把所有 .c 文件一起扔给编译器:
gcc main.c utils.c -o myprogram这行命令会把 main.c 和 utils.c 都编译、链接,生成可执行文件 myprogram。适合文件不多、不频繁修改的情况。改其中一个文件,整个重新编译一遍,有点费时间,但胜在简单。
分步编译:先编译后链接
更灵活的做法是先把每个 .c 文件编译成目标文件(.o),再把它们链接起来。
比如先编译:
gcc -c main.c
gcc -c utils.c这会生成 main.o 和 utils.o。-c 参数的意思是“只编译不链接”。这时候如果某个文件没改,就不用重复编译。
然后链接:
gcc main.o utils.o -o myprogram这样分开做,适合文件多、编译时间长的项目。
用 Makefile 自动化
手动敲命令太累,尤其是文件一多,容易出错。这时候可以写个 Makefile:
myprogram: main.o utils.o
gcc main.o utils.o -o myprogram
main.o: main.c utils.h
gcc -c main.c
utils.o: utils.c utils.h
gcc -c utils.c
clean:
rm -f *.o myprogram保存为 Makefile,然后在终端运行 make,就会自动完成编译链接。改了某个源文件,make 只重新编译受影响的部分,省时省力。
平时写小程序,直接 gcc 多文件就行;项目大了,早点学 Makefile,能少掉不少头发。