IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> gcc基本操作(带例子) -> 正文阅读

[系统运维]gcc基本操作(带例子)

1.基本介绍

??GCC(GNU Compiler Collection )是由GNU项目产生的优化编辑器,支持各种编程语言、硬件架构和操作系统。gcc在编译程序程序时,分为以下四个阶段:预处理(Pre-Processing)、编译(Compiling)、汇编(Assembling)、链接(Linking)。

2.基本工具、命令使用

??gcc的基本用法是:gcc [options] [filenames],[options]表示参数,[filenames]表示相关文件的名称,一些最基本的参数及含义下表所示:

(1)参数汇总

表1 gcc常用参数汇总表
参数名称含义
-c编译程序,但不链接成为可执行文件(linux上生成后缀为 .o 的文件)
-E编译器经过预处理阶段后停止工作,(生成后缀为 .i 的预编译文件)
–S编译器经过预处理阶段后停止工作,(生成后缀为 .s 的预编译文件)
-o一步直接生成可执行文件
-O/-O1/-O2/O3优化代码,减少代码体积,提高代码效率,但是相应的会增加编译的时间
-Os优化代码体积(注:多个-O参数默认最后一个)
-Og为调试代码做优化,不能与“-O”一起用
-O0关闭优化
---------------------------------------------------------------------------------------------------------------------
-w不输出任何警告信息
-Wall将警告视为错误,编译过程一有警告便停止编译
-g生成调试信息
-v输出 gcc 工作的详细过程
-ggdb加入GDB调试器能识别的格式
--------------------------------------------------------------------------------------------------------------------
-static链接静态库生成目标文件,禁止使用动态库(在支持动态链接的系统上)
-share尽量使用动态库,但是需要系统存在动态库,生成的目标文件较小
-shared生成共享文件,然后可以与其它文件链接生成可执行文件
-fpic生成适用于共享库的与地址无关的代码(PIC)(如果机器支持的话)
-fPIC生成与位置无关的的代码,适用于使用动态库,与“-fpic”的区别在于去除去全局偏移表的任何限制(如果机器支持的话)
-fPIE使用与地址无关的代码生成可执行文件
--------------------------------------------------------------------------------------------------------------------
-M生成适合于make规则的主要文件的依赖信息
-MM与“-M”相比忽略由“#include”所造成的依赖
-MD与-M作用类似,将输出导入到 .d 文件中
-MMD与-MM作用类似,将输出导入到 .d 文件中
-------------------------------------------------------------------------------------------------------------------
-Wa,optionoption 作为选项传递给汇编器。 如果选项包含逗号,则将其在逗号处拆分为多个选项
-Wl,optionoption 作为选项传递给链接器。如果选项包含逗号,则将其在逗号处拆分为多个选项。如:‘-Wl,-Map,output.map’ 传递 ‘-Map output.map’给链接器( GNU的链接器也可这样表示:‘-Wl,-Map=output.map’)
-T script使用script作为链接器的脚本
-I dirdir作为包含的头文件路径(-I 大写的‘i’)
-L dirdir作为‘-l’(小写的’L’)操作的文件路径

(2)简单的例子

注:使用测试环境说明

虚拟机:VM Ware 14
ubuntu:18.04 LTS
gcc版本:7.5.0

具体使用 gcc -v 命令查看如下图所示:
gcc版本信息

图1 gcc版本信息


首先我们编写一个简单的例子,输出“Hello World”:

  1 #include <stdio.h>
  2                                                                                                                                                           
  3 int main(void)
  4 {
  5     printf("Hello World\n");
  6     return 0;
  7 }

然后使用 gcc -E Hello_World.c -o Hello.i 命令生成预处理文件并且使用vim查看 Hello.i 文件,其最后一部分如下图:
在这里插入图片描述

图2 Hello.i的最后一部分内容

然后使用 gcc -S Hello.i -o Hello.s 命令将生成的预处理文件编译成汇编程序 Hello.s,并且使用vim查看 Hello.s 的内容如下图所示:
在这里插入图片描述

图3 Hello.s的内容

然后使用 gcc -c Hello.s -o Hello.o 命令将生成的汇编文件编译成目标文件 Hello.o
然后使用 gcc -static Hello.o -o Hello-s 命令将生成的目标文件静态链接最终生成可执行文件 Hello-s,同时使用 gcc Hello.o -o Hello-d 命令将生成的目标文件动态链接最终生成可执行文件 Hello-d (不指定参数默认动态链接),并且分别使用 size 命令查看文件大小如下图所示:(可以看到静态链接的代码大小比动态链接大得多)
在这里插入图片描述

图4 动静态链接代码大小对比

分别运行 Hello-sHello-d 验证可执行文件正确性如下图所示,可以看到静态库的运行时间静态库快一点(注:使用命令:time 可查看运行时间)
在这里插入图片描述

图5 动静态链接代码运行时间对比

3.稍复杂一点的例子

(1)代码

(2)操作

4.总结

5.参考

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-02-06 14:09:05  更:2022-02-06 14:09:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 5:34:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码