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

  • 相关阅读:
    SharePoint 2013 配置基于表单的身份认证
    SharePoint 2013 场解决方案包含第三方程序集
    SharePoint 2010 站点附加数据升级到SP2013
    SharePoint 2013 在母版页中插入WebPart
    SharePoint 2013 搭建负载均衡(NLB)
    SharePoint 部署解决方案Feature ID冲突
    SharePoint 2013 配置基于AD的Form认证
    SharePoint Server 2016 Update
    SharePoint 2013 为用户组自定义EventReceiver
    SharePoint 2013 JavaScript API 记录
  • 原文地址:https://www.cnblogs.com/lihello/p/14435941.html
Copyright © 2011-2022 走看看