[转载] gcc编译多个.h .c 文件

发布于 2022-10-05  1075 次阅读


Please refresh the page if equations are not rendered correctly.
---------------------------------------------------------------


gcc 与 g++ 分别是 gnu 的 c & c++ 编译器 gcc/g++ 在执行编译工作的时候,总共需要4步:

  1. 预处理,生成 .i 的文件
  2. 将预处理后的文件转换成汇编语言, 生成文件 .s
  3. 有汇编变为目标代码(机器代码)生成 .o 的文件
  4. 连接目标代码,生成可执行程序

参数详解

-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的汇编代码

-I

提示编译器寻找头文件的目录或路径,当头文件在另一个目录下时可以使用 -I 来手动添加

使用gcc编译多个.h .c 文件

.h.c文件在同一个目录下

1.c

#include 
#include "my_head.h"

int main(int argc, char *argv[]){
    print();
    return 0;
}

2.c

#include 
#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文件编译一下。

最后,再一次的编译:

附件下载:c++测试代码

Everything not saved will be lost.
最后更新于 2022-10-05