GCC编译器

一:GCC编译器介绍

        在Linux上写过C并且编译过的同学想必一定要和GCC打交道,可能刚接触的同学只知道GCC是一款编译工具。其实GCC发展至今并不是一开始作者就想把GCC打造成如今一统江山的一个工具,而是给他的另一个宏伟计划的一个配套,所谓有心插花花不活,无心插柳柳成荫。

        上面的宏伟计划就是GNU,GNU's Not UNIX,由理查德·斯托曼于 1983 年发起。GNU 计划的最终目标是打造出一套完全自由(即自由使用、自由更改、自由发布)、开源的操作系统,并初步将其命名为 GNU 操作系统。GNU有个响亮的中文名:革奴计划,其logo是一头非洲牛羚。

        GNU 计划提出之初的发展并不是一帆风顺,虽然该计划为 GNU 操作系统量身定做了名为 Thr Hurd 的系统内核,但由于其性能比不上同时期诞生的 Linux 内核,最终 GNU 计划放弃 The Hurd 而选用 Linux 作为 GNU 操作系统的内核。在 Linux 内核的基础上,GNU 计划开发了很多系统部件,GCC 就是其中之一。

        早期 GCC 的全拼为 GNU C Compiler,即 GUN 计划诞生的 C 语言编译器,显然最初 GCC 的定位确实只用于编译 C 语言。但经过这些年不断的迭代,GCC 的功能得到了很大的扩展,它不仅可以用来编译 C 语言程序,还可以处理 C++、Go、Objective -C 等多种编译语言编写的程序。与此同时,由于之前的 GNU C Compiler 已经无法完美诠释 GCC 的含义,所以其英文全称被重新定义为  GNU Compiler Collection,即 GNU 编译器套件。

        GCC 编译器从而停止过改进。截止到今日(2023 年11 月),GCC 已经从最初的 1.0 版本发展到了 13.2版本,期间历经了上百个版本的迭代。作为一款最受欢迎的编译器,GCC 被移植到数以千计的硬件/软件平台上

GCC Releases- GNU Project

二:GCC的安装(Linux)

我们本次以Centos7为平台,演示如何安装GCC。

1:yum安装

        首先我们配置好yum源,可以配成国内的镜像,默认的Centos源是官方的源,可能也能用就是很慢。

        然后直接傻瓜式的命令安装

yum -y install gcc
yum -y install gcc-c++

        执行以上两条安装命令,就可以在 CentOS 系统中利用 gcc 命令来执行 C 语言程序,利用 g++ 命令来执行 C++ 程序。需要注意的是切勿认为 gcc 只能用来编译 C 语言程序,g++ 只能用于编译 C++ 程序,这是不对的。

        这种傻瓜式的安装固然很方便,但是经历过的同学都知道这样安装的版本一般都非常低,就以我的Centos7为例,默认安装的版本是4.8.5,对于没有高版本特性或者需要使用特定版本GCC的同学而言,4.8.5是够用的。

2:手动安装

        但是如果需要高版本或者特定版本的同学就需要手动安装了。和使用 yum 自动安装 GCC 编译器不同,手动安装 GCC 编译器需要提前到 GCC 官网下载指定版本的 GCC 源码安装包,读者可直接点击GCC源码包进行下载。值得一提的是,每个版本中都包含 2 种格式的压缩包,分别为 tar.gz 和 tar.xz,只是压缩格式不同,本节以 tar.gz 压缩包教大家安装 GCC 编译器。

1>本地先安装一个GCC(用于源码编译),如果本地有可以跳过

yum install -y glibc-static libstdc++-static
yum install -y gcc gcc-c++

        第一行指令用于安装编译 C 和 C++ 代码所需的静态链接库;第二行指令用于安装编译 C 和 C++ 代码的 gcc 和 g++ 指令。 

2>下载GCC安装包

        将下载好的 gcc-10.1.0.tar.gz 安装包,将其解压至 /usr/local/ 目录下

 tar -xf gcc-10.1.0.tar.gz -C /usr/local/

 3>下载安装 GCC 所需要的依赖包

cd /usr/local/gcc-10.1.0
./contrib/download_prerequisites

注意,一定观察此命令的执行结果,保证其确实是将 gmp、mpfr、mpc 等依赖包成功下载下来,才能继续执行下面的安装步骤。

4>编译前的准备工作

手动创建一个目录,用于存放编译 GCC 源码包生成的文件

mkdir gcc-build-10.1.0
cd gcc-build-10.1.0

我们在 /usr/local 目录下手动创建了名为 gcc-build-10.1.0 的目录文件,并进入到该目录中。

由于 GCC 编译器支持多种编程语言的编译,而实际情况中我们可能只需要编译 1~2 种编程语言,因此需要对其进行必要的配置。通过执行如下指令,可以配置 GCC 支持编译 C 和 C++ 语言:

 ../gcc-10.1.0/configure --enable-checking=release --enable-languages=c,c++ --disable-multilib

 --enable-languages 用于设定 GCC 编译器支持编译的编程语言的类别,例如 c、c++、java、objc、obj-c++、go 等。

5>编译GCC

make

 注意,编译过程是非常耗时的,因此如果读者选用此方式安装 GCC,则在执行 make 命令时一定要安排合适的时间。

6>安装GCC

make install

执行完之后需要重启Linux

reboot

三:GCC常用的编译选项

-o outfile:指定输出文件名

-E:仅对源文件进行预处理,不进行编译,如果未指定-o选项则结果输出到标准输出

-S:对源文件进行预处理、编译,不进行汇编,如果未指定-o选项则结果保存到与.c文件同名的.s文件

-c:对源文件进行预处理、编译和汇编,不进行链接,如果未指定-o选项则结果保存到与.c文件同名的.o文件

-std=standard:指定语言标准版本

-D name[=definition]:预定义宏,如果省略定义则默认为1

-Wall:打开所有编译警告

-Werror:将所有警告当成错误

-Idir:将指定路径添加到头文件搜索路径列表

-Ldir:将指定路径添加到库文件搜索路径列表

-lxxx:手动指定函数库xxx参与链接
 

GCC编译优化:

gcc编译优化选项支持五种,分别是-O0、-O1、-O2、-Os和-O3。

-O0表示无优化,是默认选项。

-O1和-O2选项可以对程序进行部分编译优化,其中-O1选项尝试减小目标文件大小和缩短执行时间,而不显著增加编译时间;-O2选项增加了更多的优化选项,包括循环展开、内联函数等,会提高程序的执行性能。

-Os选项专门针对目标文件大小进行优化,执行所有不增加目标文件大小的-O2优化选项,并执行专门减小目标文件大小的优化选项。

-O3选项打开所有-O2的优化选项,并增加了循环展开、函数内联等更多的优化选项,以提高程序执行性能。

此外,还可以使用-fdefer-pop选项来延迟栈的弹出时间,以提高函数的调用速度。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/181289.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Orangepi Zero2 全志H616】驱动蜂鸣器

一、用户手册对应的I/O 二、wiringPi库示例代码 三、代码实现 四、创建shell脚本 五、接线和运行结果 一、用户手册对应的I/O 二、wiringPi库示例代码 1 #include <stdio.h>2 #include <wiringPi.h>34 #define NUM 17 //26pin5 //#define NUM 18 //26pin6 //#…

工作数字化的中国历程 | 从 OA 到 BPM 到数字流程自动化

业务流程是由“活动”&#xff08;或称“工作任务”&#xff09;构成的&#xff0c;在企业里的所有工作是不是都叫流程&#xff0c;或者属于流程的一部分&#xff0c;这个概念很绕&#xff0c;我觉得没有必要去做学究气的辨析。我曾经提出过一个从工作的两个特性&#xff08;产…

伪随机序列——m序列及MATLAB仿真

文章目录 前言一、m 序列1、m 序列的产生2、m 序列的性质①、均衡性②、游程分布③、移位相加特性④、自相关函数⑤、功率谱密度⑥、伪噪声特性 二、M 序列1、m 序列的产生2、m 序列的性质 三、MATLAB 中 m 序列1、m 序列生成函数的 MATLAB 代码2、MATLAB 仿真 前言 在通信系统…

白标软件:时间与金钱的双赢助手

白标的好处是你不需要从零开始构建一个应用程序。供应商提供软件解决方案&#xff0c;而你提供品牌&#xff0c;并将应用程序包装、市场推广和盈利。 白标软件帮助节省时间和金钱的六种方式&#xff1a; 1、不需要招募软件开发组织或专业人员 传统上&#xff0c;软件开发需要…

strongswan:configure: error: OpenSSL Crypto library not found

引子 在配置strongswan时&#xff0c;有时会遇到以下错误&#xff08;其实所有需要openssl的软件configure时都有可能遇到该问题&#xff09;&#xff1a; configure: error: OpenSSL Crypto library not found 解决方法 crypto是什么呢? 是OpenSSL 加密库(lib), 这个库需要op…

深度学习_4 数据训练之线性回归

训练数据 线性回归 基本原理 比如我们要买房&#xff0c;机器学习深度学习来预测房价。房价的影响因素有&#xff1a;卧室数量&#xff0c;卫生间数量&#xff0c;居住面积。此外&#xff0c;还需要加上偏差值来计算。我们要找到一个正确率高的计算方法来计算。 首先&#…

Solidity入门第一步之数据类型

各种类型介绍 数值类型(Value Type)&#xff1a;包括布尔型(bool)&#xff0c;整数型(int、uint、uint256)等等&#xff0c;这类变量赋值时候直接传递数值。引用类型(Reference Type)&#xff1a;包括数组和结构体&#xff0c;这类变量占空间大&#xff0c;赋值时候直接传递地…

Python---字符串中的count()方法

count()方法 主要功能&#xff1a;求子串在字符串中出现的次数 count 英 /kaʊnt/ v. &#xff08;按顺序&#xff09;数数&#xff1b;计数&#xff0c;点数目&#xff1b;把……算入&#xff0c;包括&#xff1b;重要&#xff1b;被允许&#xff0c;被接受&#xff1b;…

[自学记录08*]LDR、HDR与ToneMapping

一、Dynamic Range—动态范围 Dynamic Range表示动态范围&#xff0c;检测DR&#xff0c;DR又分为LDR&#xff08;Low Dynamic Range&#xff09;和HDR&#xff08;High Dynamic Range&#xff09;。它们都是表示亮度值范围的一种方式&#xff0c;那么有什么区别呢。 1.LDR …

ke9案例三:页面提交文件,我服务器端接收

案例三:页面提交文件,我服务器端接收 ProcessFile.java 1value "/process-file" 2获取邮件消息的所有部分part--Collection<Part> partsrequest.getParts(); 3遍历每一个part 4之后可以打印头文件等String headerpart.getHeader("content-disposition&q…

Hive【Hive(八)自定义函数】

自定义函数用的最多的是单行函数&#xff0c;所以这里只介绍自定义单行函数。 Coding 导入依赖 <dependency><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><version>3.1.3</version></dependency>…

Flow-based models(NICE);流模型+NICE+代码实现

参考&#xff1a; 李宏毅春季机器学习NICE: Non-linear Independent Components Estimationhttps://github.com/gmum/nice_pytorch 文章目录 大致思想数学预备知识Jacobian矩阵行列式以及其几何意义Change of Variable Theorem Flow-based modelNICE理论代码 大致思想 Flow-B…

Solidity数据类型之函数类型

solidity中函数的形式 function <function name>(<parameter types>) {internal|external|public|private} [pure|view|payable] [returns (<return types>)]每个关键字的意思&#xff08;方括号里面的写不写都可以&#xff09; function&#xff1a; 声明函…

【0基础学Java第七课】-- 类和对象01

7. 类和对象 7.1 面向对象的初步认知7.1.1 什么是面向对象7.1.2 面向对象与面向过程 7.2 类定义和使用7.2.1 简单认识类7.2.2 类的定义格式7.2.3 定义一个狗类7.2.4 定义一个学生类 7.3 类的实例化7.3.1 什么是实列化7.3.2 引用只能指向对象&#xff0c;且不能同时指向多个对象…

服务器基本命令

nohup python3 ./download-all-2023-11-01_12-08-11.py > T85_download.log & 标准输出重定向到文件 nohup bash test.sh > stdout.txt & 标准错误输出重定向到文件 nohup bash test.sh 2> stderr.txt & 重定向到不同文件 nohup bash test.sh > …

k8s之service五种负载均衡byte的区别

1&#xff0c;什么是Service&#xff1f; 1.1 Service的概念​ 在k8s中&#xff0c;service 是一个固定接入层&#xff0c;客户端可以通过访问 service 的 ip 和端口访问到 service 关联的后端pod&#xff0c;这个 service 工作依赖于在 kubernetes 集群之上部署的一个附件&a…

Servlet详解

一.Servlet生命周期 初始化提供服务销毁 1.测试生命周期 package com.demo.servlet;import javax.servlet.*; import java.io.IOException;public class LifeServlet implements Servlet {Overridepublic void init(ServletConfig servletConfig) throws ServletException {…

LangChain+LLM实战---使用知识图谱和大模型来实现多跳问答

原文&#xff1a;Knowledge Graphs & LLMs: Multi-Hop Question Answering 可以使用检索增强方法来克服大型语言模型(Large Language Models, llm)的局限性&#xff0c;比如幻觉和有限的知识。检索增强方法背后的思想是在提问时引用外部数据&#xff0c;并将其提供给LLM&a…

Failed to launch task: 文件”Setup”不存在 Mac安装Adobe软件报错解决方案

在安装 Adobe 软件时&#xff0c;软件提示 Failed to launch task: 文件”Setup”不存在 &#xff0c;这个时候怎么处理呢&#xff1f; 解决方法如下&#xff1a; 1、安装 AnitCC 或 或 Creative Cloud 环境&#xff0c;保证软件所需要的环境 2、如果安装后也不起作用&#x…

Scala语言用Selenium库写一个爬虫模版

首先&#xff0c;我将使用Scala编写一个使用Selenium库下载yuanfudao内容的下载器程序。 然后我们需要在项目的build.sbt文件中添加selenium的依赖项。以下是添加Selenium依赖项的代码&#xff1a; libraryDependencies "org.openqa.selenium" % "selenium-ja…