zoukankan      html  css  js  c++  java
  • 源文件在不同目录下用gcc编译多个.h .c 文件

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

    -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!
    ");
    }
    

    my_head.h

    #ifndef myhead_h
    #define myhead_h
    void  print();
    #endif
    

    image-20210223141221297

    假如他们都在一个目录下面,那么编译流程:

    gcc -c 2.c             // 只激活预处理,编译,和汇编生成2.o文件
    gcc -o main 1.c 2.o    // 连接目标代码,生成可执行程序main
    

    image-20210223141359903

    .h.c文件在不同的目录下

    在稍微大一点的项目里面,一般都会包含多个文件。尤其是包含多个头文件,各自头文件的实现,和包含main函数的文件。这样的好处就是更容易开发和维护。

    举一个简单的例子,main.cpp 文件是包含main函数的文件,在myinclude的文件下,包含了myhead.h 和 myhead.cpp 文件。分别是头文件的定义和实现。

    image-20210223142448475

    下面开始编译:
    假如在当前目录直接编译的话:

    image-20210223142748473

    直接编译的结果就是报错了,错误的原因是 默认的include目录下面没有 myhead.h 头文件。

    可以通过 -I 选项 链接上去。重新编译。

    image-20210223142916187仍然有报错,错误的原因是头文件虽然找到了,但是没有定义print函数。print函数是在2.c文件内定义的。也就是需要把2.c文件编译一下。

    image-20210223143111283

    最后,再一次的编译:

    image-20210223143449121

  • 相关阅读:
    剑指 Offer 59
    665. 非递减数列
    1423. 可获得的最大点数(滑动窗口)
    1208. 尽可能使字符串相等(双指针、滑动窗口)
    643. 子数组最大平均数 I(滑动窗口)
    剑指 Offer 52. 两个链表的第一个公共节点
    295. 数据流的中位数
    888. 公平的糖果棒交换(数组、哈希表)
    Seaborn绘图工具
    Office Politics
  • 原文地址:https://www.cnblogs.com/lihello/p/14435941.html
Copyright © 2011-2022 走看看