【Linux】环境开发工具(vim,gcc,g++,Makefile)

目录

一、Vim

1.vim安装

2.vim使用

二、gcc和g++

使用语法

1.预处理

2.编译

3.汇编

4.链接

静态库与动态库

三、Makefile和make


一、Vim

1.vim安装

默认的Linux -- vim编辑器有三大致命缺陷:

  • 界面太过简单,可以说是简陋

  • 编写程序时没有基本的自动缩进、高亮、自动补全等许多Windows编译器都有的功能,使得用起来极度不方便

  • 没有代码查错功能

我现在使用的服务器是Ubuntu 20.04,后面讲centos下的配置,先讲我当前的vim配置方案,使用的是vimplus

详细介绍请看

一个超级强大的vim 配置介绍:vimplus

安装步骤:

在对应用户的家目录安装,

cpp 复制代码
//配置vimpulus
git clone --depth=1 https://gitee.com/chxuan/vimplus.git ~/.vimplus
cd ~/.vimplus
./install.sh

//如果插件不会生效, 重新执行下面指令:
sudo apt install vim-youcompleteme
vim-addon-manager install youcompleteme



也可按照以下顺序无脑安装:
cd ~
sudo apt update
sudo apt install git build-essential cmake python3-dev python3-pip -y
git clone https://github.com/chxuan/vimplus.git ~/.vimplus
cd ~/.vimplus
./install.sh

再输入y  输入3 等待安装成功

出现这个就是安装完成

这时创建一个cpp文件发现界面被替换成功了。

还有一个我之前在Centos7.6环境下使用的配置,很好用,但是目前只能在centos7.6使用,只要输入命令行可以一键安装,curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh,想进一步了解可以打开下面链接

VimForCpp: 快速将vim打造成c++ IDE

2.vim使用

vim本质上就是一个多模式的文本编辑器,我们可以在里面编写代码。

这里我来介绍vim最常用的三种模式:命令模式、插入模式、底行模式。

**命令模式:**主要用于控制光标移动、文本的删除(剪切)、复制与粘贴等快捷操作。

插入模式: 唯一的文本输入模式。日常编写代码或文字时使用最频繁的模式。按 i、a、o 等键进入,按 Esc 键返回命令模式。

底行模式: 用于执行保存退出、查找替换(字符串)等全局操作。在命令模式下输入 : 进入。

①命令模式------>插入模式

  1. 输入「i」:在当前光标处进入插入模式。

  2. 输入「a」:在当前光标的后一位置进入插入模式。

  3. 输入「o」:在当前光标处新起一行进入插入模式。

②命令模式------>底行模式

  • 输入「Shift+;」

③插入模式或底行模式------>命令模式

  • Esc

这个图片是vim常用的命令

二、gcc和g++

gcc编译器是专门用来编译C语言的,而g++编译器主要用来编译C++,也可以用来编译C++。

就是进行了如下四个步骤 预处理(预编译),编译,汇编,链接,将我们的源文件生成可执行程序

可输入下面指令进行安装:

cpp 复制代码
Ubuntu

    bash
    # 安装GCC和G++
    sudo apt install gcc g++ -y
    
    # 验证安装
    gcc --version
    g++ --version

CentOS

    bash
    sudo yum install gcc-c++ -y

    # 验证安装
    gcc --version
    g++ --version

使用语法

gcc/g++ 【选项】 要编译的文件 【选项】 目标文件

1.预处理

cpp 复制代码
gcc -E test.c -o test.i   //预处理后的文件名用.i结尾
  • 预处理功能主要包括头文件展开、去注释、宏替换、条件编译等。

  • 预处理指令是以#开头的代码行。

  • -E选项的作用是让gcc/g++在预处理结束后停止编译过程。

  • -o选项是指目标文件,"xxx.i"文件为已经过预处理的原始程序。

2.编译

cpp 复制代码
gcc -S test.i -o test.s
  • gcc/g++首先检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,将代码翻译成汇编语言。

  • 用户可以使用-S选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。

  • -o选项是指目标文件,"xxx.s"文件为已经过翻译的原始程序。

3.汇编

cpp 复制代码
 gcc -c test.s -o test.o

把编译阶段生成的"xxx.s"文件转成目标文件.o。

使用-c选项就可以得到汇编代码转化为"xxx.o"的二进制目标代码

4.链接

cpp 复制代码
gcc test.o -o test
  • gcc/g++不带-E、-S、-c选项时,就默认生成预处理、编译、汇编、链接全过程后的文件test。

  • 若不用-o选项指定生成文件的文件名,则默认生成的可执行文件名为a.out。

静态库与动态库

函数库一般分为静态库和动态库两种:

  • 静态库是指编译链接时,把库文件的代码全部加入到可执行文件当中,因此生成的文件比较大,但在运行时也就不再需要库文件了,静态库一般以.a为后缀。

  • 动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件当中,而是在程序运行时由链接文件加载库,这样可以节省系统的开销,动态库一般以.so为后缀。

gcc默认生成的二进制程序是动态链接的

ldd test 是查看test程序所依赖的库

静态链接

动态链接就是程序还未加载到内存时,就已经和动态库建立了信息上的连接,执行到库函数的时候,跳转到动态库执行,然后继续执行自己的代码。优点是节省资源,缺点是一旦丢失,所有程序都无法运行。

静态链接就是把你用的方法,拷贝到可执行程序里。

静态链接的优点:不依赖任何库,自己独立就能运行。

缺点:体积大,占据资源多(占据磁盘空间,内存空间),加载速度受影响。

三、Makefile和make

  • 一个工程的源文件不计其数,按照其类型、功能、模块分别放在若干个目录当中,Makefile定义了一系列的规则来指定:哪些文件需要先编译,哪些文件需要后编译,甚至于进行更复杂的功能操作。

  • Makefile带来的好处就是"自动化编译",一旦写好,只需一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

  • make是一个命令工具,是一个解释Makefile当中指令的命令工具

  • make是一条命令,Makefile是一个文件

使用vim 编写Makefile文件

Makefile文件最简单的编写格式是,先写出文件的依赖关系,然后写出这些文件之间的依赖方法,依次写下去。

保存退出直接make 就可得到目标文件

也有Makefile文件的简写方式

.PHONY

格式:.PHONY: XXX 作用:修饰后XXX对应的方法总是要被执行的。

上方make使用一次后就不能继续使用了,是因为此时生成的可执行程序已经是最新的了,不需要更新。如果这里的目标文件也被,PHONY修饰,也可以一直执行。

这里的更新实际是对比可执行文件和源文件的各自的最近修改时间,如果可执行文件最新,就不会编译,如果源文件最新,就会重新编译(即新旧时间的对比)。

  1. $@:表示依赖关系中的目标文件(冒号左侧)。

  2. $^:表示依赖关系中的依赖文件列表(冒号右侧全部)。

  3. $<:表示依赖关系中的第一个依赖文件(冒号右侧第一个)。

项目清理

重新编译前通常需清理旧的中间文件和可执行程序。由于手动清理既繁琐且指令固定,我们可以将清理指令写入 Makefile 中,实现一键清理。

就是上面的clean

一般将这种clean的目标文件设置为伪目标,用.PHONY修饰,伪目标的特性是:总是被执行。

相关推荐
机 _ 长40 分钟前
05 智算运维|8 张卡怎么才算「捆成一张」:NCCL 实测与拓扑
运维·人工智能·算法·智算运维
andxe2 小时前
工业级 PoE 交换机选型指南:破解边缘部署四大核心难题
运维·网络·安全·光通信·交换机
Decay__2 小时前
14_MySQL 高可用与容灾架构 —— MGR / InnoDB Cluster / Keepalived+VIP / 双主 / 读写分离 / 两地三中心
运维·数据库·sql·mysql·架构
木子欢儿4 小时前
国内 macOS/Linux 安装 rust
linux·运维·服务器·macos·rust
say_fall4 小时前
【Linux网络编程】计算机网络基础:局域网与广域网、OSI七层模型与TCP/IP五层模型、封装解包与MAC/IP地址、端口号与socket编程接口
linux·网络·tcp/ip·计算机网络·信息与通信
迪菲赫尔曼4 小时前
【基础篇 26】第一次在服务器完成训练:准备数据、断线继续、检查成果与备份
运维·服务器·人工智能·机器学习·计算机视觉
进击的荆棘4 小时前
Linux系统——线程同步与互斥
linux·运维·服务器·策略模式·同步·互斥·posix
橙橙笔记4 小时前
QT的学习第四部分
linux·qt·学习·音视频
.道阻且长.4 小时前
Linux基本开发工具:gdb和cgdb的使用
linux·运维·服务器·开发语言