zoukankan      html  css  js  c++  java
  • 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++编译完毕之后的代码是不同的



  • 相关阅读:
    汇总:unity中弹道计算和击中移动目标计算方法
    Unity3D游戏开发之SQLite让数据库开发更简单
    3DMAX可编辑多边形常用命令-桥
    3dmax沿立方体边扩展出面
    3dmax切割平行线
    Litjson
    使用 Unity 3D 开发游戏的架构设计难点
    Unity T4M 中文讲解
    unity5.5打包
    颜色模式
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/7123341.html
Copyright © 2011-2022 走看看