• gcc学习(一)[第二版]


    gcc简单介绍

    1、 gcc是GNU Compiler Collection的缩写。

    最初是作为C语言的编译器(GNU C  Compiler),作者为Richard Stallman。是GNU项目的奠基者;如今已经支持多种语言。如C、C++、Java、Pascal、Ada、COBOL语言等 。

     

    2、主要特征:

    gcc是一个可移植的编译器,支持多种硬件平台,甚至对Don Knuth 设计的 MMIX 这类不常见的计算机都提供了完好的支持 

    gcc不不过个本地编译器,它还能跨平台交叉编译(在本地编译的程序。能够运行在其它平台之上)。

    gcc有多种语言前端。用于解析不同的语言。

    gcc是按模块化设计的,能够增加新语言和新CPU架构的支持

    gcc是自由软件

     

    gcc编译程序的过程

     

    1)预处理(Pre-Processing) [-E] #头文件展开

    2)编译(Compiling) [-S]

    3)汇编(Assembling) [-c] 

    4)链接(Linking) [不加不论什么选项]

     

     

    经常使用选项

    选项

    作用

    -E

    预处理,生成.i文件

    -S

    编译,生成.s汇编文件

    -c

    汇编,编译源代码生成.o目标文件

    Null

    链接,并不须要不论什么选项

    -o

    生成目标文件。如.i,.o,.s,可运行文件,默觉得a.out文件等

    -Wall

    使gcc对源代码有问题的地方发出警告

    -I[dir]

    将dir增加头文件的搜索路径

    -L[dir]

    将dir增加库文件的搜索路径

    -l[lib]

    链接lib

    -g

    在目标文件里嵌入调试信息,以便gdb调试程序调试

    -O

    优化编译后的代码

    -w

    关闭所有警告信息[不推荐]

    演示样例

    //測试程序
    #include <stdio.h>
    
    #define HELLO "Hello World!!!
    "
    
    int main(int argc,char *argv[])
    {
        printf(HELLO);
    
        return 0;
    }

     

    操作:

    gcc -E hello.c -o hello.i(预处理)

     

     

    gcc -S hello.i -o hello.s(编译,生成汇编代码)

     

     

    gcc -c hello.s -o hello.o(汇编,生成二进制代码)

     

     

    gcc hello.o -o hello(链接:不须要额外选项,生成可运行文件)

     

     


    gcc hello.c -o hello(直接编译链接成可运行目标文件)

    gcc -c hello.c或gcc -c hello.c -o hello.o(编译生成可重定位目标文件)

     

    -Wall的使用

    建议初学都加上-Wall选项。有些程序不加-Wall选项,编译器不报不论什么错误,可是得到的结果却不是预期的。例如以下:

    //bad.c
    #include <stdio.h>
    
    int main(int argc,char *argv[])
    {
        printf("2 + 2 = %f
    ",4);
    
        return 0;
    }



    gcc编译多个文件

    一次性编译

    gcc [-Wall] hello_fn.c main.c –o newhello

     

    独立编译

    gcc -Wall -c main.c -o main.o

    gcc -Wall -c hello_fn.c -o hello_fn.o

    gcc -Wall main.o hello_fn.o -o newhello #链接生成可运行文件

    长处:假设不过修改了一个模块,则不用再次编译所有模块。以节省编译时间[推荐]

     

    附-測试程序

    //hello_fu.h
    #ifndef _HELLO_FUN_H
    #define _HELLO_FUN_H
    
    void hello(const char *str);
    
    #endif

    //hello_fu.c
    #include <stdio.h>
    #include "hello_func.h"
    
    void hello(const char *str)
    {
        printf("Hello %s
    ",str);
        printf("Compiled: "__DATE__" at "__TIME__"
    ");
        printf("This is line %d of file %s
    ",__LINE__,__FILE__);
    
        return;
    }

    //main.c
    #include "hello_func.h"
    
    int main()
    {
        hello("world");
    
        return 0;
    }

    附-Makefile

    CC = gcc 

    CFLAGS = -Wall -g

     

    BIN = main

    SOURCES = $(wildcard *.c)

    OBJECTS = $(SOURCES:.c=.o)

     

    .PHONY: all clean

     

    all: $(BIN)

    $(BIN): $(OBJECTS)

    $(CC) $(CFLAGS) -o $@ $^

     

    %.o: %.c 

    $(CC) $(CFLAGS) -c $< -o $@

     

    clean:

    -rm -rf $(BIN) $(OBJECTS)


    gcc须要识别文件扩展名

     

    扩展名

    含义

    .c

    C源文件

    .cpp/cc

    C++源文件

    .o

    目标文件

    .s

    汇编语言源文件

    .a/.so

    编译后的库文件

     

     

     

    用gcc发现出错之处

     

    发现是在链接阶段出了错!

     

     

    C/C++编译完毕之后的代码是不同的



  • 相关阅读:
    Spring boot 优雅实现全局自定义异常
    多线程基本知识
    软件测试开发实战 | 记录写装饰器时踩的几个坑
    软件测试 | charles 中文乱码问题【已解决】
    测试人生 | 折腾 6 年踩坑无数的“笨小孩”:方向对了,路就不会遥远!
    软件测试 | 读懂 Appium 日志,让测试效率翻倍!
    Appium 实践 | 让测试更快更稳更可靠:片状测试
    软件测试实践干货 | 测试登录功能的思路与原理解析(基于 Spring Security)
    软件测试
    PageObject(PO)设计模式在 UI 自动化中的实践总结(以 QQ 邮箱登陆为例)
  • 原文地址:https://www.cnblogs.com/yfceshi/p/6846118.html
Copyright © 2020-2023  润新知