首页 > 系统相关 >Linux下的gcc命令

Linux下的gcc命令

时间:2024-06-06 23:34:11浏览次数:31  
标签:选项 文件 gcc 编译 命令 Linux test 链接

转载:https://blog.csdn.net/weixin_47826078/article/details/120474122

文章目录

准备: test.c

在正式开始之前,若是想要通过一个代码(.c文件)来熟悉gcc的编译流程,可以在你的测试目录下使用如下代码:

// 文件名:test.c
     1  #include <stdio.h>
     2  #include <stdlib.h>
     3
     4  int main(int argc, char *argv[])
     5   {
     6    int arg;
     7    for(arg = 0; arg < argc; arg++){
     8      if(argv[arg][0] == ‘-’)
     9            printf("option:%s\n",argv[arg]+1); 
    10      else
    11            printf("argument %d:%s\n",arg,argv[arg]);
    12      }
    13    exit(0);
    14    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

1. 编译过程

在使用gcc编译程序时,编译过程可以简要划分为4个阶段:

  1. 预处理
  2. 汇编
  3. 编译
  4. 链接

在这里插入图片描述

1.1 预处理(Pre-Processing)

这个阶段主要处理源文件中的#indef、#include和#define预处理命令;
这里主要是把一些include的头文件和一些宏定义,放到源文件中。

  • 输入的是C语言的源文件
  • 输出 :生成一个中间/预加载文件 *.i(以 .i 结尾的文件)
  • 这个阶段对应的gcc命令如下:
    #gcc –E(预处理) test.c(源文件) -o test.i(将结果生成的文件)
  • 说明:它通过对源文件test.c使用E选项来生成中间文件test.i

1.2 汇编(Assembling)

  • 输入:中间文件*.i

  • 输出:编译后生成汇编编语言文件*.s

  • 这个阶段对应的gcc命令如下:
    #gcc -S(汇编) test.i -o test.s(汇编编语言文件)

  • 说明:它通过对源文件test.c使用S选项来生成汇编文件test.s

1.3 编译(Compiling)

  • 输入文件:汇编文件*.s
  • 输出文件:二进制机器代码*.o
  • 这个阶段对应的gcc命令如下:
    #gcc -c(编译) test.s -o test.o

* gcc -c

在功能上,预处理、编译、汇编是3个不同的阶段
但gcc在实际操作时可以把这3个步骤合并为一个步骤来执行,即使用 -c选项:

  • 输入文件:源码*.c文件
  • 输出文件:二进制机器代码*.o
  • 这个阶段对应的gcc命令如下:
    # gcc –c test.c -o test.o
    // -o指定了output_filename
    或 :
    #gcc -c test.c
    //省略-o output_filename
    //默认输出为test.o
    //与源文件同名,后缀为.o

1.4 链接(Linking)

  • 输入文件:二进制机器码*.o文件
  • 输出文件:与其它的机器代码和库文件汇集成一个可执行的二进制代码文件(无后缀)
  • 这个阶段对应的gcc命令如下:
    #gcc (没有选项符号) test.o example.o -o test

可用选项:
-L 指定库路径
-l (小写的L)指定库名称
-I (大写的i)指定头文件所在路径
-i 指定头文件名称

选项详解:

选项用法解释
-l(大写的i)-Idirname(没有间隔)将名为dirname的目录加入到程序头文件目录列表中,它是在预处理阶段使用的选项,I是指Include
-L-Ldirname将名为dirname的目录加入到程序的库文件搜索目录列表中,它是在链接过程中使用的参数, L是指Link
-l (小写的L)-lname指示编译器,在链接时,装载名为libname.a的函数库,该函数库位于系统预定义的目录或者由-L选项指定的目录下

· 例:-lm 表示链接名为libm.a的数学函数库

2. 简化过程 —— gcc

  • 上述过程可以简化为:
    #gcc test.c (源文件) -o test(可执行文件)
    注意:与链接的语句差别主要在指令中输入文件的后缀

注:
1.库是头文件的实现!
2.在编译过程中可以被装载/拷贝的库为静态库(.a后缀)
· 更多关于静态库/动态库的知识请参考这篇博客:详解Linux下静态库/动态库(含代码示例)

3. gcc常用选项总结

常用选项

选项功能
-c只编译,不链接成可执行文件,编译器只是由输入的.c等为后缀的源代码文件生成.o为后缀的标文件,通常用于编译不包含主程序的子程序文件
-ooutput_filename 确定输出文件的名称为output_filename,同时这个名称不能和源文件名。如果不给出这个选项,gcc就默认将输出的可执行文件命名为a.out
-g产生调试器gdb所必须的符号信息,要对源代码进行调试,就必须在编译程序时加入这个选项
-O对程序进行优化编译、链接,采用这个选项,整个源代码会在编译、链接过程中进行优化处理,这样产生的可执行文件的执行效率较高,但是,编译、链接的速度就相应地要慢一些。
-O2比-O更好的优化编译、链接
-Wall输出所有警告信息
-w关闭所有警告信息
-Idirname(没有间隔,大写 i )将名为dirname的目录加入到程序头文件目录列表中,它是在预处理阶段使用的选项,I是指Include
-Ldirname将名为dirname的目录加入到程序的库文件搜索目录列表中,它是在链接过程中使用的参数。
· L是指Link
-lname(小写的L)指示编译器,在链接时,装载名为libname.a的函数库,该函数库位于系统预定义的目录或者由-L选项指定的目录下
  • gcc使用例子:
    (1) gcc -Wall src.c –o dest -lpthread
    /*输出所有警告信息地编译src.c生成dest可执行文件
    /*并在链接时装入libpthread.a的函数库
    —————————————————————————
    (2)gcc -Wall -o sniffex sniffex.c -lpcap
    /*输出所有警告信息地编译sniffex.c生成sniffex可执行文件
    /*并在链接时装入libpcap.a的函数库

标签:选项,文件,gcc,编译,命令,Linux,test,链接
From: https://www.cnblogs.com/mingyuer/p/18236288

相关文章

  • 【四】Linux重定向、管道符、通配符、转义字符详解
    重定向与管道符重定向输入重定向是指把文件导入到命令中,而输出重定向则是指把原本要输出到屏幕的数据信息写入到指定文件中。输出重定向使用较多,故将输出重定向分为了标准输出重定向和错误输出重定向,以及覆盖写入与追加写入两种模式。输出重定向的符号及其作用:命令>文件......
  • 【一】Linux基础命令讲解
    Linux系统内核与Linux发行套件系统。Linux系统内核指的是提供硬件抽象层、硬盘及文件系统控制及多任务功能的系统核心程序。Linux发行套件系统是我们常说的Linux操作系统,也即是由Linux内核与各种常用软件的集合产品。常见的有:1、红帽企业版Linux(RHEL)2、社区企业操作系统Cen......
  • 如何在Windows系统下配置最新的MinGW(GCC14)环境,同时应用到Dev-C++中
    如何在Windows系统下配置最新的MinGW(GCC14)环境,同时应用到Dev-C++中前言本教程只面向小白,目的是配置出一个Windows能用的新GCC环境,未深入涉及细节配置。在访问文中链接时,你可能需要使用能更快速访问国际网络的工具。安装MinGW环境先访问MinGW的官网:https://www.mingw-w64.org/......
  • Linux开发:多进程通过shm_open/mmap共享内存
    Linux编程:多进程间通过shmget共享内存_检测共享内存中是否有数据-CSDN博客介绍了通过SYSV的方式进行多进程间共享内存,这种方式属于比较久远的方式。POSIX也提供了共享内存的方法,使用起来要更容易些式其原理是利用Linux的tmpfs(Linux开发:tmpfs文件系统-CSDN博客)$df......
  • JetBrians的clion在运行代码时无法进行system("cls")清屏命令
    终极任务:找到小扳手在代码运行的基础下找到这个小扳手如果是新UI界面的话,在运行的基础下点这三个点这里是修改运行配置的地方下拉找到"在外部控制台中运行"的选项勾选上,就可以在后面的运行调用电脑自带的控制台了......
  • linuxc
    Linux编程环境编译链接3.1LinuxC程序的编译执行3.1.1gcc常用指令https://gcc.gnu.org/onlinedocs/gcc/#toc-GCC-Command-Options构建相关:看不懂没事,可以看下一个加粗部分"调试和优化相关的示例"-E:预处理,生成.i文件-S:预处理+编译,生成.s汇编语言文件-c:预处理+编......
  • 虚拟机安装Linux(Ubuntu24)
     1、虚拟机软件    已经上传了下载链接,可进入本人博客的资源下载        https://download.csdn.net/download/qq_42837317/89402103如果下架,请自行查找下载资源。搜索 VMware workstation 172、ubuntu版本    建议按需求安装ubuntu版本,可......
  • linux安装驱动
    1.查看显卡信息 sudolshw-classdisplay2.安装驱动   驱动网址:下载地址:https://www.nvidia.cn/geforce/drivers/ 官网查找驱动版本并复制链接 查找对应的版本 右击鼠标复制链接3.连接虚拟机下载驱动 wget+复制的连接  修改权限 chomd777+N......
  • Linux权限理解
    目录一、基本的具体用户认识:二、Linux权限管理:1权限简单理解:2文件访问者分类(角色):3 文件类型和访问权限(事物属性):3.1文件类型:3.2基本权限:4文件权限值的表示方法:5 文件访问权限的相关设置方法:(1)chmod:(2)chown:(3) chgrp:(4)umask: 6 目录的权限:7粘滞位: 三、......
  • LINUX基本知识(1)
    linux基本知识网络设置:桥接模式:位于同一个网段的其他机器可以访问NET模式:虚拟化一个路由器,连接虚拟路由器,位于同一个网段的机器不可以访问设置静态IP:可以远程连接时IP地址不会改变远程连接:虚拟机需要安装服务端程序:sshdLinux架构:内核(kernel):1:管理硬件资......