草庐IT

Linux搭建C++开发环境

HyoJoo-W 2023-12-29 原文

Linux 开发C++

1 Linux操作系统

[username@hostname ~]$ uname -a

2 GCC编译器

[username@hostname ~]$ gcc --version

3 Vim命令行代码编辑器

不要问我为什么不用VSCode?为什么不用CLion?为什么不用Fleet?直接开干就完事了。

Vim是一款命令行编辑器。

3.1 Vim安装

请安装vim8及以上版本!

3.1.1 Linux(CentOS)下安装

yum -y install vim

3.1.2 MacOS下安装

macos自带vim,即Vim。可使用vim --version查看,但是自带的vim部分特性不支持,如conceal,可使用homebrew重新安装vim和macvim。

  1. brew安装
brew install vim
brew install macvim
vim --version
  1. 配置别名
编辑.zshrc或.bash_profile
alias vi=vim
alias vim=mvim
alias mvim='/opt/homebrew/bin/mvim -v'
  1. 安装deoplete报错E605

3.1.3 重要的几个配置文件(目录)

  • .vimrc
  • .vim
  • .viminfo

3.2 Vim使用

3.2.1 Vim模式

  1. normal进入insert
  • i: insert
  • I: 在行首insert
  • a: append
  • A: 在行尾append
  • o: open a line below
  • O: open a line above
  1. normal进入command
  • :
  • /
  1. normal进入visual
  • v: 选择光标所在当前字符
  • V: 选择光标所在当前行
  • <ctrl + v>: 块状选择
  1. normal模式
  • u: 撤销操作
  • <ctrl + r>: 反撤销操作

3.2.2 insert模式——快速编辑

  1. 快速纠错快捷键
  • <ctrl + h>: 删除上一个字符
  • <ctrl + w>: 删除上一个单词
  • <ctrl + u>: 删除当前行(即删除一个换行符???)

补充Unix终端快捷键:

  • <ctrl + a>: 移到行首
  • <ctrl + e>: 移到行尾
  • <ctrl + b>: 光标前移一个字符
  • <ctrl + f>: 光标后移一个字符
  1. 快速切换到normal模式
  • <ctrl + [>
  1. 快速跳转到最后一次编辑的位置并进入插入模式
  • gi

3.2.3 normal模式——快速移动

  1. 传统移动:左(h)、下(j)、上(k)、右(l

  2. 单词间移动

  • w/W: 移到下一个word/WORD开头
  • e/E: 移到下一个word/WORD结尾
  • b/B: 移到上一个word/WORD开头

word: 以非空白符(空格)分隔的单词
WORD: 以空白符分隔的单词

  1. 行间快速移动(搜索一个字符并移动到该字符上)
  • f/F{char}: 向 后/前 搜索并移动到该char字符上
  • t/T{char}: 向 后/前 搜索并移动到该char的前一个字符上
  • 可以使用;搜索并移动到该行下一个匹配字符
  • 可以使用,搜索并移动到该行上一个匹配字符
  1. 水平移动
  • 0: 移动到行首第一个字符;^移动到行首第一个非空白字符
  • $: 移动到行尾最后一个字符;g_移动到行尾最后一个非空白字符
  1. 垂直移动
  • ( / ): 在句子间移动
  • { / }: 在段落间移动
  1. 页面移动
  • gg: 移动光标到文件首部
  • G: 移动光标到文件尾部
  • <ctrl + o>: 返回
  • H/M/L: 移动光标到屏幕 头部/中间/尾部
  • <ctrl + u> / <ctrl + f>: 向上(upward) / 向下(forward)翻页
  • zz: 将屏幕置为中间 (可能会翻页!zz ! =M)
  • ZZ: 保存并退出

3.2.4 CRUD

: vim的一个抽象概念,比如一个单词,一个句子,一个段落

  1. <digit><command><TextObject>
  • digit: 操作次数
  • command: 命令,如d(delete),c(change),y(yank)
  • TextObject: 如w(word),s(sentence),p(paragraph)
  1. 示例(i: inner;a: around)
  • viw: 选中当前word
  • vaw: 选中当前word包括空格
  • vi{/}/(/)/"/':选中括号或冒号之间的内容
  1. normal模式——删除
  • x: 快速删除光标所在字符
  • d + <TextObject>: 快速删除一个单词;如dw(删除光标后的单词)daw(delete around a word)diw(delete in aword)
  • <digit> + x / d + <TextObject>: 执行多次;如2xx4daw
  • dd / D: 删除当前行
  • d + t + <character>: delete to ,删除光标到之前的字符
  1. normal模式——修改
  • r + <character>: replace,替换光标所在字符为输入的新字符,仍是normal模式

  • <digit> + r + <character>: replace,替换光标后面个字符,仍是normal模式

  • R: 进入REPLACE,连续替换多个字符

  • c + <TextObject>: change,删除一个并进入insert模式;如cw(删除光标后的单词)ciwcaw

  • cc / C: change,删除当前行并进入insert模式

  • c + t + <character>: change,删除之前的字符并进入insert模式

  • c + h/j/k/l: 删除 左边一个字符/下一行/上一行/右边一个字符,并进入insert模式

  • s: 删除当前字符并进入insert模式

  • <digit> + s: substitute,删除个字符并进入insert模式

  • S: substitute,删除当前行并进入insert模式

  1. normal模式——查询
  • / + <word>: 前向搜索

  • ? + <word>: 反向搜索

  • *: 当前单词的前向匹配

  • #: 当前单词的反向匹配

  • n/N: 跳转到下一个/上一个匹配

  • 设置增量搜索

3.2.5 替换

:[range] s[ubstitute]/{pattern}/{string}/[flags]

  • range: 表示范围,如10,20表示10-20行,%表示全部
  • pattern: 要替换的模式,支持正则表达式
  • string: 替换后的文本
  • flags: 有几个常用标志位,g(global)表示全局执行;c(confirm)表示确认;n(number)表示报告次数而不匹配

3.2.6 Vim多文件操作

  1. buffer

  1. window


  • 窗口移动: <ctrl + w>H/J/K/L

3.2.7 复制粘贴

  1. normal模式
  • y: yank
  • p: put
  • d: delete

visual模式

  • v/V: 选中想复制的内容,然后p粘贴

配合文本对象

  • yiw: 复制一个单词
  • yy: 复制一行
  1. insert模式
  • <ctrl + v>: 粘贴

set autoindent:设置自动缩进
set paste:设置粘贴模式进入insert模式粘贴可以避免缩进混乱

  1. Vim寄存器

Vim剪切使用的是寄存器,而不是系统剪贴板!默认放入无名寄存器(“”)。

  • Tips: 调换两个字符:x-> p
  • "{register}: 表示使用寄存器{register},如"ayiw表示复制一个单词到寄存器a
  • "0: 复制专用寄存器("0),使用y会同时放入无名寄存器和复制专用寄存器
  • "+: 复制到系统剪贴板,echo has('clipboard')查看是否支持系统剪贴板功能
  • "%: 当前文件名存放的寄存器
  • ".: 上次插入的文本所存放在的寄存器

3.2.8 Vim宏

  1. 概念:可以看成是一系列命令的集合
  2. 使用:录制(q{register}) + 回放(@{register}),均是q命令录制和退出
  3. 示例:给多行代码加上引号
0. 光标移到行首,(normal模式)qreg1
1. i" esc
2. A" esc
3. (normal模式)q
4. j
5. V
6. G
7. :normal @reg1

3.2.9 Vim补全

常用:

  1. <ctrl + n><ctrl + p>: 补全单词
  2. <ctrl + x><ctrl + f>: 补全文件名
  3. <ctrl + x><ctrl + o>: 补全代码,需要开启文件类型检查(:filetype on),安装插件
  • 多个候选项:<ctrl + n>下一个;<ctrl + p>上一个

3.3 Vim配置、映射与脚本

3.3.1 配置

编写~/.vimrc文件

3.3.2 映射

  1. 设置leader
  2. 自定义命令执行外部命令

3.3.3 VimScript

  • 简单的脚本语言

3.4 Vim插件

3.4.1 插件管理器

  1. 安装vim-plug
  2. 编写.vimrc
  3. 添加/更新/删除插件

3.4.2 寻找插件

3.5 搭建C++开发环境

3.5.1 nerdtree(目录树)

Plug 'preservim/nerdtree'
nnoremap <leader>v :NERDTreeFind<cr>
nnoremap <leader>g :NERDTreeToggle<cr>

3.5.2 tagbar(符号列表)

方式一:brew install --HEAD universal-ctags/universal-ctags/universal-ctags

方式二:
brew tap universal-ctags/universal-ctags
brew install --HEAD universal-ctags
Plug 'preservim/tagbar' //安装tagbar
nnoremap <leader>t :TagbarToggle<cr> //映射<leader>t 打开tagbar

3.5.3 LeaderF(文件查找)

Plug 'Yggdroot/LeaderF', { 'do': ':LeaderfInstallCExtension' }

3.5.4 deoplete.nvim + LanguageClient + clangd(代码补全、函数跳转)

  1. deoplete.nvim
" deoplete.nvim
if has('nvim')
  Plug 'Shougo/deoplete.nvim', { 'do': ':UpdateRemotePlugins' }
else
  Plug 'Shougo/deoplete.nvim'
  Plug 'roxma/nvim-yarp'
  Plug 'roxma/vim-hug-neovim-rpc'
endif
let g:deoplete#enable_at_startup = 1
Plug 'Shougo/deoplete-clangx'
  1. LanguageClient-neovim
  1. clangd

3.5.5 AsyncRun(shell命令异步运行)

Plug 'skywind3000/asyncrun.vim'

3.5.6 my .vimrc

  • 开箱即用
  • 几乎没有个性化的映射
  • 安装的插件几乎全部使用原生命令
  • 最大限度的通用性
" ========= my .vimrc ========
" :help 可以用来查看帮助文档!!!
" ========== 常用设置<begin> ==========
" 不使用兼容模式
set nocompatible

" 设置字符集
set encoding=utf-8

" 与buffer有关的hidden
" abandoned的Buffer隐藏起来,这是vim的设置。
" 如果没有这个设置,修改过的文件需要保存了才能换buffer
" 这会影响全局重命名,因为Vim提示保存因此打断下一个文件的重命名。
set hidden

" 设置行号
set number

" 设置tab宽度为4个空格
set tabstop=4
set expandtab

" 设置主题(需要安装插件)
colorscheme default

" 设置高亮搜索
set hlsearch

" 设置语法高亮
syntax on

" 设置折叠方式(按缩进,za展开/关闭)
" set foldmethod=indent

" 显示光标当前位置
"set ruler

" 高亮显示当前行/列
set cursorline
set cursorcolumn

" ========== 常用设置<end> ==========

" ========== 映射设置<begin> ==========
" 设置leader变量
let mapleader=','

" insert模式下使用 jj 进入 normal 模式
inoremap jj <Esc>`^


" ========== 映射设置<end> ==========

" ========== 插件设置<begin> ==========
" 使用vim-plug插件管理器
call plug#begin('~/.vim/plugged')
" vim-startify插件(vim启动页)
Plug 'mhinz/vim-startify'

" vim-airline插件(状态栏显示)
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'

" yggdroot/indentline(缩进线显示)
"(MacVim) conceal is invalid. To use the plugin, please enable the conceal
" Plug 'yggdroot/indentline'

" w0ng/vim-hybrid(颜色主题)
Plug 'w0ng/vim-hybrid'
colorscheme hybrid

" nerdtree(目录树)
Plug 'preservim/nerdtree'
nnoremap <leader>v :NERDTreeFind<cr>
nnoremap <leader>g :NERDTreeToggle<cr>
let NERDTreeShowHidden=0
let NERDTreeIgnore=['\.git$','\DS_Store$']

" ctrlp-vim(文件搜索)
Plug 'ctrlpvim/ctrlp.vim'
let g:ctrlp_map = '<c-p>'

" vim-easymotion(移动到任意位置)
Plug 'easymotion/vim-easymotion'
nmap ss <Plug>(easymotion-s2)

" vim-surround(成对编辑)
Plug 'tpope/vim-surround'

" vim-interstingwords(高亮单词)
Plug 'lfv89/vim-interestingwords'

" vim-commentary(注释代码)
Plug 'tpope/vim-commentary'

" tagbar(需要依赖universal ctags)
Plug 'preservim/tagbar'
nnoremap <leader>t :TagbarToggle<cr>

" LeaderF(文件查找)
Plug 'Yggdroot/LeaderF', { 'do': ':LeaderfInstallCExtension' }

" 代码补全、提示、函数跳转(deoplete + LanguageClient + clangd)
" ========== deoplete.nvim ===============================================
if has('nvim')
  Plug 'Shougo/deoplete.nvim', { 'do': ':UpdateRemotePlugins' }
else
  Plug 'Shougo/deoplete.nvim'
  Plug 'roxma/nvim-yarp'
  Plug 'roxma/vim-hug-neovim-rpc'
endif
let g:deoplete#enable_at_startup = 1

" 补全结束或离开插入模式时,关闭预览窗口
autocmd InsertLeave,CompleteDone * if pumvisible() == 0 | pclose | endif


" deoplete 的c/c++ completion source(选用LanguageClient插件 +
" clangd作为c/c++ 的completion source源,就不需要这个设置啦)
" Plug 'Shougo/deoplete-clangx'

" ========== deoplete.nvim ===============================================

" ========== LanguageClient-neovim =======================================
Plug 'autozimu/LanguageClient-neovim', {
    \ 'branch': 'next',
    \ 'do': 'bash install.sh',
    \ }

" 把Server的补全API提交给Vim
" 一般有deoplete就可以用了,加上一条以防万一。
set completefunc=LanguageClient#complete
" 把Server的格式化API提交给Vim
set formatexpr=LanguageClient_textDocument_rangeFormatting()

" (Optional) Multi-entry selection UI.
Plug 'junegunn/fzf'

" 为语言指定Language server和server的参数
let g:LanguageClient_serverCommands = {
            \ 'cpp': ['clangd'],
            \ 'c': ['clangd'],
            \ }

" 告诉LS那个文件夹才是project root,同时也告诉它compile_commands在哪里
let g:LanguageClient_rootMarkers = {
            \ 'cpp': ['compile_commands.json', 'build'],
            \ 'c': ['compile_commands.json', 'build']
            \ }

" ========== LanguageClient-neovim =======================================

" AsyncRun(异步运行)
Plug 'skywind3000/asyncrun.vim'
let g:asyncrun_open=6

call plug#end()

" ========== deoplete.nvim 补充===============================================
" 为每个语言定义completion source
" 是的vim script和zsh script都有,这就是deoplete
call deoplete#custom#option('sources', {
            \ 'cpp': ['LanguageClient'],
            \ 'c': ['LanguageClient'],
            \ 'vim': ['vim'],
            \ 'zsh': ['zsh']
            \})

" 用户输入至少两个字符时再开始提示补全
call deoplete#custom#source('LanguageClient',
            \ 'min_pattern_length',
            \ 2)

" 字符串中不补全
call deoplete#custom#source('_',
            \ 'disabled_syntaxes', ['String']
            \ )
" ========== deoplete.nvim 补充===============================================

" ========== 插件设置<end> ==========

" ========== VimScript设置<begin> ==========
" 设置打开文件光标停留在上次退出的位置
" au BufReadPost * if line("'\"") > 0 | if line("'\"") <= line("$") | exe("norm '\"") | else |exe "norm $"| endif | endif

" ========== VimScript设置<end> ==========

3.6 Tmux(终端复用工具)

参考:https://www.ruanyifeng.com/blog/2019/10/tmux.html

4 GDB程序调试器

https://www.sourceware.org/gdb/

有关Linux搭建C++开发环境的更多相关文章

  1. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  2. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  3. ruby - 是否可以覆盖 gemfile 进行本地开发? - 2

    我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI

  4. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  5. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

    我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain

  6. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  7. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  8. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

  9. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  10. ruby-on-rails - ruby gem如何在rails环境下工作 - 2

    我试图在rails中了解rubygems是如何变得可以自动使用的,而不是在使用required的文件中gem? 最佳答案 这是通过bundler/setup完成的:http://bundler.io/v1.3/bundler_setup.html.它在您的config/boot.rb文件中是必需的。简而言之,它首先将环境变量设置为指向您的Gemfile:ENV['BUNDLE_GEMFILE']||=File.expand_path('../../Gemfile',__FILE__)然后它通过要求bundler/setup将所有ge

随机推荐