源文件在不同目录下用gcc编译多个.h .c 文件
gcc 与 g++ 分别是 gnu 的 c & c++ 编译器 gcc/g++ 在执行编译工作的时候,总共需要4步:
- 预处理,生成 .i 的文件
- 将预处理后的文件转换成汇编语言, 生成文件 .s
- 有汇编变为目标代码(机器代码)生成 .o 的文件
- 连接目标代码,生成可执行程序
参数详解
-c
只激活预处理,编译,和汇编,也就是他只把程序做成obj文件
例子用法:
gcc -c hello.c
他将生成 hello.o 的 obj 文件
-S
只激活预处理和编译,就是指把文件编译成为汇编代码。
例子用法:
gcc -S hello.c
他将生成 .s 的汇编代码,你可以用文本编辑器察看。
-E
只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面。
例子用法:
gcc -E hello.c > pianoapan.txt
gcc -E hello.c | more
慢慢看吧,一个 hello word 也要与处理成800行的代码。
-o
制定目标名称,默认的时候,gcc 编译出来的文件是 a.out。
例子用法:
gcc -o hello hello.c // 生成名为hello的.out可执行文件
gcc -o hello.asm -S hello.c // 生成名为hello.asm的汇编代码
-l
提示编译器寻找头文件的目录或路径,当头文件在另一个目录下时可以使用 -I 来手动添加
使用gcc编译多个.h .c 文件
.h.c文件在同一个目录下
1.c
#include <stdio.h>
#include "my_head.h"
int main(int argc, char *argv[]){
print();
return 0;
}
2.c
#include <stdio.h>
#include "my_head.h"
void print(){
printf("Hello world!\n");
}
my_head.h
#ifndef myhead_h
#define myhead_h
void print();
#endif
假如他们都在一个目录下面,那么编译流程:
gcc -c 2.c // 只激活预处理,编译,和汇编生成2.o文件
gcc -o main 1.c 2.o // 连接目标代码,生成可执行程序main
.h.c文件在不同的目录下
在稍微大一点的项目里面,一般都会包含多个文件。尤其是包含多个头文件,各自头文件的实现,和包含main函数的文件。这样的好处就是更容易开发和维护。
举一个简单的例子,main.cpp 文件是包含main函数的文件,在myinclude的文件下,包含了myhead.h 和 myhead.cpp 文件。分别是头文件的定义和实现。
下面开始编译:
假如在当前目录直接编译的话:
直接编译的结果就是报错了,错误的原因是 默认的include目录下面没有 myhead.h 头文件。
可以通过 -I 选项 链接上去。重新编译。
仍然有报错,错误的原因是头文件虽然找到了,但是没有定义print函数。print函数是在2.c文件内定义的。也就是需要把2.c文件编译一下。
最后,再一次的编译: