• Linux下C/C++编程开发(一)GCC


    前言

    下面的所有操作的的操作都是基于:

    • 操作系统:Ubuntu20.04.3-desktop
    • GCC-Version:gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
    • G+±Version:g++ (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0

    一、GCC

    GCC 原名为 GNU C 语言编译器(GNU C Compiler)是由 GNU 开发的编程语言译器。GNU 编译器套件包括 CC++Objective-CJavaAdaGo 语言前端,也包括了这些语言的库(如 libstdc++libgcj 等)

    二、 安装GCC、G++

    在终端中输入sudo apt install gcc g++ 即可完成安装,然后通过gcc --versiong++ --version 就可以查看当前安装的版本,如下:

    mangata@mangata:~$ g++ --version
    g++ (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
    Copyright (C) 2019 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    
    mangata@mangata:~$ gcc --version
    gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
    Copyright (C) 2019 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    

    三、GCC的工作流程

    在这里插入图片描述
    我们在编译代码的时候的流程基本就是上面的步骤:预编译->编译->汇编->链接

    假设我们有一个代码test.c

    #include 
    
    #define MAX_SIZE 5
    
    int main()
    {   
        int res = MAX_SIZE;    
        int len = MAX_SIZE;
        for(int i = 0;i < len; ++i) 
            printf("Hello world %d\n",i);
        return 0;
    }
    '
    运行

    3.1 预编译

    在终端中输入:

    gcc -E test.c -o test.i
    

    然后就会生成一个test.i 文件,这个其实就是预编译处理后的源代码

    在这里插入图片描述

    我们可以看到main 函数中的MAX_SIZE已经被替换了

    3.2 编译

    在终端输入:

    gcc -S test.i -o test.s
    

    此时就会生成一个 test.s 的汇编代码

    在这里插入图片描述

    3.3 编译

    在终端输入:

    gcc -c test.s -o test.o
    

    此时就会生成一个 test.o 的二进制代码

    在这里插入图片描述

    3.4 链接

    在终端输入:

    gcc -o test test.o
    

    此时就会生成一个 test 的可执行程序,此时我们就可以通过./test 运行我们的程序了~

    在这里插入图片描述

    3.5 一步到位

    当然我们也可以一步到位,直接从 .c 文件生成 可执行文件:

    gcc -o test test.c
    

    四、GCC、G++常用编译选项

    gcc编译选项说明
    -E预处理指定的源文件,不进行编译
    -S编译指定的源文件,但是不进行汇编
    -c编译、汇编指定的源文件,但是不进行链接
    -o [file1] [file2] 或者 [file2] -o [file1] 将文件 file2 编译成可执行文件 file1
    -Idirectory 指定 include 包含文件的搜索目录
    -g在编译的时候,生成调试信息,该程序可以被调试器调试
    -D在程序编译的时候,指定一个宏
    -w不生成任何警告信息
    -Wall生成所有警告信息
    -On n n n 的取值范围: [ 0 , 3 ] [0,3] [0,3] 编译器的优化选项的 4 4 4 个级别,-O0表示没有优化,-O1 为缺省值,-O3 优化级别最高
    -l在程序编译的时候,指定使用的库
    -L指定编译的时候,搜索的库的路径。
    -fPIC/fpic生成与位置无关的代码
    -shared生成共享目标文件,通常用在建立共享库时
    -std指定C方言,如:-std=c99gcc默认的方言是GNU C

    五、GCC和G++区别

    • 编译阶段,g++ 会调用 gcc ,对于 C++ 代码,两者是等价的,但是 因为 gcc 命令不能自动和 C++ 程序使用的库联接,所以通常用 g++ 来完成链接,为了统一起见,干脆编译/链接统统用 g++ ,这就给人一种错觉,好像 c++ 程序只能用 g++ 似的,所以对于不需要链接的 C++ 程序而言我们仍然可以使用 gcc 编译

    • 如果源代码文件后缀为 .c ,并且采用 gcc 编译器那么 __cplusplus 宏是未定义的,否则是定义的

    例如我们有如下代码 a.cc

    #include 
    
    int main()
    {   
        #ifdef __cplusplus
        printf("__cplusplus is define!\n");
        #endif
        return 0;
    }
    '
    运行

    然后编译生成可执行文件a : gcc -o a a.cc
    我们执行这个程序的时候会发现,终端输出了__cplusplus is define! 也表示__cplusplus宏是定义的,即便是用gcc 编译

    在这里插入图片描述

    • 编译可以用gcc/g++,而链接可以用g++或者gcc -lstdc++
    • gcc命令不能自动和C++程序使用的库联接.所以通常使用g++来完成联接。但在编译阶段, gcc会自动调用g++,二者等价
  • 相关阅读:
    【Vue 实战】 生成二维码
    Vue 和 React 的区别
    开发轻量级REST API样板 基于Node.js、MongoDB 通过Mongoose驱动
    windows-连接到同一网络的2台电脑共享文件
    Git Commit Message 应该怎么写?
    【ARM AMBA Q_Channel 详细介绍】
    【FPGA教程案例30】基于FPGA的DDS直接数字频率合成器之三——借助MATLAB进行频率精度分析
    Rust6.2 An I/O Project: Building a Command Line Program (mini_grep)
    不知道10年老电脑如何重装系统?其实很简单
    JavaScript总结
  • 原文地址:https://blog.csdn.net/m0_46201544/article/details/127038381