Linux 编程环境

文章目录

    • Vim
    • GCC
    • GDB
    • Make

Vim

Vim

GCC

GCC(GNU Compiler Collection)是一款编译语言编译器,此项目最早由GNU计划的发起者理查德· 斯托曼开始实施。第一版GCC于1987年发行,最初的GCC代表GNU C Compiler,即GNU的C语言编译器。后来经过不断地发展,GCC适应了C++、Objective-C、Java、Go等更多编译语言。GCC最重要的特点为实现跨硬件平台编译,即可在当前的CPU平台上为其他体系结构的硬件平台(ARM、MIPS、X86、PowerPC)开发软件,目前这一方式被广泛应用于嵌入式开发中。

GCC编译器的工作目的就是将开发者编写的语言代码变成可以被机器识别的二进制码。

一个完整的编译器主要由以下4部分组成,它们可称为编译器的主要组件。
(1)分析器:将源程序代码转换为汇编语言。
(2)汇编器:将汇编语言的代码转换为CPU可以执行的字节码。
(3)链接器:将汇编器生成的单独的目标文件组合成可执行的应用程序。
(4)标准C库:提供对核心函数的支持,如果应用程序使用到C库中的函数,C库就会通过链接器与源代码连接,来生成最终的可执行程序。

  • gcc(GUN C Compiler)是GCC中的c编译器
  • g++(GUN C++ Compiler)是GCC中的c++编译器。

gcc和g++两者都可以编译c和cpp文件,但存在差异。gcc在编译cpp时语法按照c来编译但默认不能链接到c++的库(gcc默认链接c库,g++默认链接c++库)。g++编译.c和.cpp文件都统一按cpp的语法规则来编译。所以一般编译c用gcc,编译c++用g++。

GCC 编译器是 Linux 下默认的 C/C++ 编译器,大部分 Linux 发行版中都是默认安装的。若需要安装,在终端中执行以下命令安装。

sudo apt install build-essential	# 安装
gcc --version						# 查看版本也可以安装其他组件
sudo apt install g++
sudo apt install gfortran
gcc hello.c -o hello 		# 编译生成 hello 可执行文件
./hello						# 运行可执行文件	上述命令实际上是多个步骤的结合,依次为:
gcc hello.c -E -o hello.i	# 预处理(Pre-Processing),生成预编译文件 .i
gcc hello.i -S -o hello.s	# 编译(Compiling),生成汇编文件 .s
gcc hello.s -c -o hello.o	# 汇编(Assembling),生成目标文件(二进制文件).o
gcc hello.c -o -o hello.out	# 链接(Linking),生成可执行程序 .exe / .out

GCC 参数详解

gcc编译器版本切换

gcc -v 	# 查看版本
g++ -v 	# 查看版本
sudo apt-get install gcc-12 	# 安装
sudo apt-get install g++-12 	# 安装
ls /usr/bin/gcc*				# 查看当前系统中编译器版本
ls /usr/bin/g++*# 设置编译器的优先级
sudo udate-alternatives --install usr/bin/gcc gcc /usr/bin/gcc-12 100
sudo udate-alternatives --install usr/bin/gcc gcc /usr/bin/gcc-11 100
sudo udate-alternatives --install usr/bin/g++ g++ /usr/bin/g++-12 100
sudo udate-alternatives --install usr/bin/g++ g++ /usr/bin/g++-11 100# 切换编译器的版本
sudo update-alternatives --config gcc
# 示例如下
root@ubuntu:~# sudo update-alternatives --config gcc
There are 2 choices for the alternative gcc (providing /usr/bin/gcc).Selection    Path             Priority   Status
------------------------------------------------------------0            /usr/bin/gcc-11   100       auto mode
* 1            /usr/bin/gcc-11   100       manual mode2            /usr/bin/gcc-12   100       manual mode
Press <enter> to keep the current choice[*], or type selection number: 2
update-alternatives: using /usr/bin/gcc-12 to provide /usr/bin/gcc (gcc) in manual mode
root@ubuntu:~# gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/12/lto-wrapper# 切换编译器的版本
sudo update-alternatives --config g++

GDB

GDB,全称GNU调试器(GNU Debugger),是一个强大的Unix系统下的源代码级调试工具。它可以帮助程序员查看程序在执行过程中的内部状态,从而更好地理解程序的运行机制。GDB主要用于调试C和C++语言编写的程序。它的存在,使得我们能够更深入地了解程序的运行过程,找出并修复程序中的错误。

  • 准备这样一份 hello.c
#include<stdio.h>
void swap(int a, int b) {int t = a;a = b;b = t;printf(" swap : a = %d, b = %d \n", a, b);
}int main(int argc, char* argv[]) {int a = 10, b = 20;printf("start : a = %d, b = %d \n", a, b);swap(a, b);printf("  end : a = %d, b = %d \n", a, b);return 0;
}
sudo apt-get install gdb 	# 安装 gdb
gdb -v 						# 查看版本gcc hello.c -g -o hello	 	# 生成可调式的可执行文件
gdb hello	# 执行调试,进入调试界面
list 1 		# 从第 1 行开始查看调试文件
list		# 继续查看 
break [line] 	# 设置断点,还有其他方式
info break [n] 	# 长查看断点 [n] 为断点号
r				# 运行代码
p + var			# 查看当前 变量 var 的值
continue		# 恢复程序运行
step / next [count]	# 单步执行,count条指令
quit			# 退出gdb模式
kill			#停止程序执行

【Linux】GDB保姆级调试指南(什么是GDB?GDB如何使用?

Make

make是linux中的自动化构建工具,一般来说系统会自带make,如果没有,安装即可。

sudo apt install make 	# Debian系安装make

make是个命令,也是个可执行程序,用来解析Makefile 文件的命令,这个命令存放在/usr/bin/目录下。

Makefile 是描述程序的编译规则的文本文件,执行 make 命令的时候,make 命令会在当前目录下寻找 Makefile 文件,根据Makefile文件里的规则,编译程序。

Makefile的编写语法规则

 目标:依赖文件列表命令列表
  • 目标:要产生的文件名称,目标可以是可执行文件或其他object文件
  • 依赖文件列表:由多个依赖文件组成,每个依赖文件是用来输入而产生目标的文件,一个目标通常有0个或多个依赖文件
  • 命令列表:由0个或多个命令组成,代表 make 执行的动作,注意一个规则可以包含多个命令,存在多个命令时,每个命令占一行

Makefile文件内容举例:

  • 使用 vim Makefile,并输入以下信息
hello:hello.ogcc -o hello hello.c
clean:rm hello @rm *.o

hello 可执行文件的生成需要依赖 hello.o 文件,通过 gcc -o hello hello.c 生成相应文件。

clean 是清空命令,可以用来删除相应的信息。

@ 符号的使用可以取消回显。

root@ubuntu:~$ ls
hello.c  Makefile
root@ubuntu:~$ cat Makefile 
hello:hello.ogcc -o hello hello.c
clean:rm hello@rm *.o
root@ubuntu:~$ make		# 利用make自动构建项目
cc    -c -o hello.o hello.c
gcc -o hello hello.c
root@ubuntu:~$ ls
hello  hello.c  hello.o  Makefile
root@ubuntu:~$ ./hello
Hello World
root@ubuntu:~$ make clean  # 项目清理
rm hello
root@ubuntu:~$ ls
hello.c  Makefile
root@ubuntu:~$ 

多个源文件的项目构建样例

  • main.c
#include<stdio.h>
#include "func.h"int main(int argc, char* argv[]){func();return 0;
}
  • func.c
#include<stdio.h>void func(){puts("Hello World");
}
  • func.h
#ifndef _FUNC_H
#define FUNC_Hvoid func();#endif
  • Makefile
main : main.o func.o                    # 目标:依赖gcc main.o func.o -o main       # 指定依赖如何生成目标
main.o : main.cgcc -c main.c -o main.o         # .o文件依赖于.c文件
func.o : func.cgcc -c func.c -o func.o
.PHONY:clean    # 伪目标,避免出现符号clean与文件clean重名的情况
clean:rm *.o main
  • 执行
make		# 执行编译
make clean	# 清除处理,删除目标文件
  • Makefile 使用自动变量进行替换
main : main.o func.ogcc $^ -o $@
main.o : main.cgcc -c $< -o $@
func.o : func.cgcc -c $< -o $@
.PHONY:clean
clean:rm *.o main
  • Makefile 自定义变量
CC = gcc
OBJS = main.o func.o
CFLAGS = -Wall -O2 -g
OBJ = main      # 定义变量(无类型),并赋值$(OBJ) : $(OBJS)$(CC) $^ -o $@
#$(OBJ).o : $(OBJS).c
#        $(CC) $(CFLAGS) -c $< -o $@
#func.o : func.c
#        $(CC) $(CFLAGS) -c $< -o $@
.PHONY:clean
clean:rm -f *.o $(OBJ)

Makefile 的规则

  1. 编译C程序的隐含规则:.o 的依赖自动推导为 .c
  2. 链接目标文件的隐含规则: 可执行文件的依赖自动推导为 .o
CC = gcc
OBJS = main.o func.o
CFLAGS = -Wall -O2 -g
OBJ = main      # 定义变量(无类型),并赋值$(OBJ) : $(OBJS).PHONY:clean
clean:rm -f *.o $(OBJ)
  1. VPATH 的使用
    如果在当前目录没有找到对应的文件,会到 PATH 指定的目录下寻找。
CC = gcc
OBJS = main.o func.o
CFLAGS = -Wall -O2 -g
OBJ = main
VPATH = ./test ./func$(OBJ) : $(OBJS).PHONY:clean
clean:rm -f *.o $(OBJ)

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

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

相关文章

JSONP跨域访问漏洞

一、漏洞一:利用回调GetCookie <?php$conn new mysqli(127.0.0.1,root,root,learn) or die("数据库连接不成功"); $conn->set_charset(utf8); $sql "select articleid,author,viewcount,creattime from learn3 where articleid < 5"; $result…

JuiceFS vs HDFS,最简单的 JuiceFS 入门

你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益: 了解大厂经验拥有和大厂相匹配的技术等希望看什么,评论或者私信告诉我! 文章目录 一、背景二、JuiceFS 入门2.1 核心特性2.2 JuiceFS 架构2.3 JuiceFS 如何存储文…

音频进阶学习二十四——IIR滤波器设计方法

文章目录 前言一、滤波器设计要求1.选频滤波器种类2.通带、阻带、过度带3.滤波器设计指标 二、IIR滤波器的设计过程1.设计方法2.常见的模拟滤波器设计1&#xff09;巴特沃斯滤波器&#xff08;Butterworth Filter&#xff09;2&#xff09;切比雪夫滤波器&#xff08;Chebyshev…

vue3源码分析 -- runtime

runtime运行时&#xff0c;主要在packages/runtime-core目录下&#xff0c;核心提供了h、render等函数。在理解它们之前&#xff0c;我们需要了解下HTML DOM 树和虚拟 DOM等概念 HTML DOM 树 通过节点构成的一个树形结构&#xff0c;我们称为HTML DOM节点树。DOM 文档里面做了…

清明假期在即

2025年4月2日&#xff0c;6~22℃&#xff0c;一般 遇见的事&#xff1a;这么都是清明出去玩&#xff1f;你们不扫墓的么。 感受到的情绪&#xff1a;当精力不放在一个人身上&#xff0c;你就会看到很多人&#xff0c;其实可以去接触的。 反思&#xff1a;抖音上那么多不幸和幸…

tomcat 目录结构组成

文章目录 背景文件结构层级一些常用的路径 背景 现在非常多的 java web 服务部署在 linux 服务器中&#xff0c;我们服务器中的 tomcat 会有各种文件路径&#xff0c;看下它有哪些文件 文件结构层级 ├── bin/ # 核心脚本和启动文件 ├── conf/ # …

多层内网渗透测试虚拟仿真实验环境(Tomcat、ladon64、frp、Weblogic、权限维持、SSH Server Wrapper后门)

在线环境:https://www.yijinglab.com/ 拓扑图 信息收集 IP地址扫描 确定目标IP为10.1.1.121 全端口扫描 访问靶机8080端口,发现目标是一个Tomcat服务,版本

NOIP2010提高组.引水入城

*前置题目 901. 滑雪 #include <iostream> #include <algorithm> #include <cstring>using namespace std;const int N 310, INF 0x3f3f3f3f; const int dx[4] {0, -1, 0, 1}, dy[4] {1, 0, -1, 0};int n, m, h[N][N]; int f[N][N]; int ans;int dfs(i…

Share02-小小脚本大大能量

各位看官你们好&#xff0c;又是一篇共享知识点的文章&#xff0c;今天我们来聊一聊脚本在我们上位组态中的作用。各个厂家的上位软件或者触屏软件都内嵌了脚本功能&#xff0c;有的是二次开发的固定指令格式&#xff0c;有的可以接收广域的标准语言指令。它带给我们更多的方便…

LangChain接入azureopenai步骤(2025年初)

背景&#xff1a; 为了快速且规范的实现ai应用&#xff0c;可使用LangChain框架&#xff0c;便于后期维护。虽然deepseek异军突起&#xff0c;在终端用户占有率很高&#xff0c;但是仔细查阅相关api接口&#xff0c;尤其是自有知识库需要使用的文本向量化模型方面&#xff0c;o…

阿里云国际站代理商:模型训练中断数据丢失怎么办?

定期保存训练状态&#xff1a;在训练过程中&#xff0c;设定自动保存训练状态的频率&#xff0c;将模型的参数、优化器状态、训练数据的中间结果等定期保存到存储介质上。这样&#xff0c;当中断发生时&#xff0c;可以恢复到上次保存的状态&#xff0c;避免训练进度的损失。 …

C++17更新内容汇总

C17 是 C14 的进一步改进版本&#xff0c;它引入了许多增强特性&#xff0c;优化了语法&#xff0c;并提升了编译期计算能力。以下是 C17 的主要更新内容&#xff1a; 1. 结构化绑定&#xff08;Structured Bindings&#xff09; 允许同时解构多个变量&#xff0c;从 std::tup…

2025年Axure RP9无法免费使用Axure Cloud的解决方案

解决方案 更换新账号&#xff0c;换了一个邮箱注册&#xff0c;再登陆&#xff0c;又会给你30天的试用期。 对&#xff0c;办法就是换个邮箱注册&#xff0c;又续上30天的试用期。

供应链中的的“四流合一”

在供应链中&#xff0c;物流、资金流、信息流、商流是共同存在的&#xff0c;商流、信息流和资金流的结合将更好的支持和加强供应链上、下游企业之间的货物、服务往来&#xff08;物流&#xff09;。 一、商流 在供应链中&#xff0c;上下游供应商的资金链条均可被金融服务机构…

MonkeyDev 如何创建一个root级级别的app

前提条件:有越狱的手机,XCode中已经安装了Monkeydev 1. 和普通应用一个创建一个ios的工程 2. 在App的TARGETS>build setting> 中设置Apple Development 3. 设置User-Defined的配置 CODE_SIGNING_ALLOWED = NO MonkeyDevBuildPackageOnAnyBuild = NO MonkeyDevClearUi…

Excel时间类型函数(包括today、date、eomonth、year、month、day、weekday、weeknum、datedif)

目录 1. TODAY()2. DATE()3. EOMONTH()4. YEAR()5. MONTH()6. DAY()7. WEEKDAY()8. WEEKNUM()9. DATEDIF()10.&#x1f4cc; 函数扩展与应用11. &#x1f4da; 时间函数基础概念与分类 Excel 提供了许多 日期与时间类型的函数&#xff0c;用于操作与处理日期或时间数据。这些函…

Lumerical ------ Edge coupler design

Lumerical ------ Edge coupler design 引言正文无 Si Substrate 的仿真步骤有 Si Substrate 的仿真步骤引言 本文,我们将使用官方提供的 Edge coupler 设计教程,但是中间会带有作者本人的设计的感悟。 正文 无 Si Substrate 的仿真步骤 打开 Edge_Coupler_No_Substrate.l…

Spring笔记06-数据持久化

在 Spring 中&#xff0c;数据持久化是将应用程序中的数据保存到持久化存储&#xff08;如数据库&#xff09;中的过程 &#xff0c;主要通过以下几种方式实现&#xff1a; 1. JDBC&#xff08;Java Database Connectivity&#xff09; 原理&#xff1a;JDBC 是 Java 访问关系…

spring boot集成reids的 RedisTemplate 序列化器详细对比(官方及非官方)

RedisTemplate 序列化器详细对比&#xff08;官方及非官方&#xff09; 1. 官方序列化器 (1) JdkSerializationRedisSerializer 特点&#xff1a; 基于 Java 原生序列化&#xff08;Serializable&#xff09;。支持复杂对象&#xff08;需实现 Serializable 接口&#xff09;…

ssh私钥文件登录问题:Load key invalid format

问题 在mac上面使用私钥文件登录时候&#xff0c;出现了如下错误&#xff1a; Load key “xxx.pem”: invalid format 但是&#xff0c;这个私钥文件在win上面能够正常使用ssh进行远程登录。在mac上面不能。而且&#xff0c;分别在win和mac上面分别查看了这两个私钥文件的md5…