如 Visual Studio、IDEA 这样的集编写编译调试运行以及各种复杂功能于一身的开发工具,叫做集成开发环境 IDE。Linux 下一般使用代码编辑工具 vi/vim,编译工具 gcc/g++,调试工具 gdb。
vim,它是一款十分强大的多模式的文本编辑器,所有的类 unix 系统都会内置 vi 编辑器,目前使用较多的是 vim 编辑器,是 vi 的升级版。
虽说 vim 是个文本编辑器,但它更专注于代码的编写,具有语法高亮等功能。
$ vim fileName # 使用vim打开文件,文件不存在则会创建文件。
vim 基本的模式有三:命令模式(normal mode)插入模式(insert mode)底行模式(command mode),vim 启动默认进入命令模式。
命令模式下输入i可以进入输入模式,再按Esc键就可以回退到命令模式。
命令模式下输入:即可进入底行模式,再按Esc键就可以回退到命令模式。
底行模式下输入wq可以保存退出。

知悉上述基本的模式切换方法后,再逐个介绍模式。
vim 启动默认进入命令模式。此状态下敲击键盘动作会被 Vim 识别为命令,而非输入字符。
可进行的操作有:控制光标移动,字符、单词或行的删改,移动或复制粘贴文本内容,切换到插入或底行模式。
命令模式只有一些最基本的命令,因此仍要依靠底线命令模式输入更多命令。
命令模式下输入:即可进入底行模式,底线命令模式可以输入多个字符的命令,可用的命令非常多。
文本编辑模式。一般要先退回到命令模式才能进到底行模式。
vim 总共有13种模式,但这三个基本模式已经能满足我们大部分需求,其他模式会在之后的使用中学习。
i,a,o,进入底行模式:Esc。i是从光标的位置开始输入,a选项会将光标向后移动一位,o选项在所在行下方另起一行。Esc退回到命令模式后并光标向前移动一位。H、⬇J、⬆K、➡L,相当于方向键。^、行尾$;跳至文章起始gg、末尾G;跳至指定行n+gg/n+G。w,移动到单词的末尾e,反向单词距移动b。(字符、字母、字母数字组合都被视为单词)Ctrl+B光标向下翻页,Ctrl+F向上翻页;Ctrl+U向下移动半页,Ctrl+D向上移动半页。x,删除多个字符n+x;反向删除字符X,反向删多个字符n+X。dw,删除当前行dd。r,替换多个字符n+r,进入替换模式R。cw,修改多个单词cnw。~。yw,复制多个单词n+yw。yy,复制多行n+yy。dd,剪切/删除多行n+dd。p,粘贴多次n+p。撤销操作u。
恢复操作Ctrl+r。
shift+i将光标移动到行首并进入插入模式,Ctrl+v进入行可视化模式,jk控制光标移动到待注释的内容的结束行,//,再按Esc回到命令模式。shift+6将光标移动到行首,Ctrl+v进入行可视化模式,jk控制光标移动到待注释的内容的结束行,再hl横向移动光标扩选行首的//。d就能将所选行的行首注释标识删除。底行模式命令有很多,目前掌握这几个就行。
w可以保存文件,输入q可以退出程序。带上!表示强制执行。set nu,取消行号set nonu。n即可。vs fileName,切换操作文件/光标Ctrl+w+w。/Keyword,输入/再输入查找的字符,在按n可以跳转至下一个关键字所在位置。?keyword,输入/再输入查找的字符,在按n可以跳转至上一个关键字所在位置。shift+*,查找当前光标所在的单词。
gcc/g++ 分别是 C/C++ 的编译器。
$ gcc [选项] 编译文件 [选项] 目标文件
$ g++ [选项] 编译文件 [选项] 目标文件
接下来将通过使用 gcc 分段编译程序,来熟悉 gcc/g++ 的使用。
前面已经学过 C/C++ 程序基本的编译过程,也使用过 gcc 进行查看程序的翻译步骤:

预处理的功能主要包括替换宏,文件包含,条件编译,删除注释等。
$ gcc -E test.c -o test.i # 完成预处理
选项-E让翻译在预处理结束后停下来,预处理完的文件一般后缀为.i。
编译时,gcc 会检查代码规范、语法错误,确定代码所做的工作,检查无误后 gcc 会生成汇编代码。
$ gcc -S test.i -o test.s # 完成编译
编译阶段会生成汇编代码,以供接下来的汇编阶段使用。一般编译结束生成的代码文件的后缀为.s。
汇编阶段将编译所形成的汇编代码生成目标文件,也就是二进制文件。
$ gcc -c test.s -o test.o # 完成汇编
虽然生成的是二进制目标文件,但仍然不可直接运行,准确的来说该文件是可重定向目标文件。
上述编译过程结束,最后要进行链接。链接完成之后,就生成了可执行文件。
$ gcc test.o -o test # 完成链接
链接是将本文件和项目中其他源文件或者库文件链接在一起。如图所示:

通常写程序时,就
include了语言本身所提供的链接库文件,至于链接库文件到底是什么,接下来会讲解。
当然编译 C/C++ 程序,不需要上述这么复杂,直接执行即可:
$ gcc test.c -o test
$ gcc -o test test.c
语言本身会提供语言级别的库,库可以看成一套头文件和一套库文件。可以通过引用对应的头文件,来使用这些库。
使用lld命令可以查看可执行程序所依赖的第三方库:

Linux 下的 C 静态库叫作libcxxx.a,动态库叫做libcxxx.so。一般去掉前后缀,xxx就是库名。
将用户所写的程序文件和第三方库提供的方法关联起来,这就叫链接。链接又分为静态链接和动态链接。

由上图可以看出,gcc 默认采用动态链接的方式生成的可执行程序。
$ gcc test.c -o test # 默认动态方式
$ gcc test.c -o test_static -static # 采用静态方式
静动态链接两者最大的区别就在于链接的时机不一样,静态链接是在形成可执行程序前,而动态链接是在程序执行时。
链接要确定多文件相互调用函数的地址,静态链接会将库的内容拷贝到可执行程序中。然后才能生成可执行程序文件,所以说静态链接发生在形成可执行程序之前。

由上图可以看出,静态链接生成的文件比动态链接的体积大得多。
静态链接的缺点:
静态链接的优点:
可执行程序中已经具备了所有需要的东西,不需要到其他文件中查找,在执行的时候运行速度快。
动态链接把程序按模块拆分成独立的部分,并把链接这个过程推迟到了运行时再进行,运行时由操作系统的装载程序加载库。
运行程序1时会将程序1加载到内存中,然后再加载所需库文件,再运行程序2时,内存中已有库文件就不会再次加载,直接链接到程序2中即可。
动态链接的优点:
动态链接的缺点:
链接推迟到程序运行时,每次执行程序都需要进行链接,性能有一定损失,运行速度相对慢一点。
-static 采用静态链接。-g 生成调试模式生成程序。-shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库。-O0,-O1,-O2,-O3 编译器的4个优化级别,–O0没有优化,–O1为缺省值,–O3优化级别最高。-w 不生成任何警告信息,-Wall 生成所有警告信息。
gdb 是 Linux 下用于调试代码的工具,这个工具成本高难度也不低且不是很方便直观但仍需掌握。
生成程序有两种模式:Debug 和 Release 模式。
Linux 下 gcc/g++ 编译出的可执行程序,默认是 Release 模式。要使用 gdb 调试,必须在代码编译的时候加上调试信息。
$ gcc test.c -o test_debug -g # 加上调试信息
$ gdb test_debug # 进入gdb调试
(gdb) quit # 退出gdb
| 名称 | 命令 | 解释 |
|---|---|---|
| 开始运行 | run | 相当于开始调试F5,会运行至程序结束 |
| 逐语句 | step | 相当于F11,有函数会进入函数内部 |
| 逐过程 | next | 相当于F10,不会进入函数内部,执行整条语句; |
像逐过程、逐语句这样的命令一次输入之后,可直接回车仍会再次执行。

| 名称 | 命令 | 解释 |
|---|---|---|
| 可指定行号 | list + [N] | 从第 N 行开始显示 10 行代码,可接着上次的位置继续打印 |
| 可指定函数名 | list + Name | 从函数起始位置左右开始显示代码。 |

| 名称 | 命令 | 解释 |
|---|---|---|
| 某行打断点 | b + N | 在某行打上断点 |
| 函数打断点 | b + FuncName | 在函数内起始位置打断点 |
| 查看断点 | info + b | 显示断点信息列表 |
| 删除断点 | d + b + N | 删除序号为 N 的断点,省略序号就是删除所有断点 |
| 启用断点 | enable + b + N | 启用序号为 N 的断点,省略序号就是启用所有断点 |
| 禁用断点 | disable + b + N | 禁用序号为 N 的断点,省略序号就是禁用所有断点 |

| 名称 | 命令 | 解释 |
|---|---|---|
| 监视变量 | display + ValName | 以列表的形式常显示在屏幕下方,类似于vs中的监视 |
| 取消监视 | undisplay + N | 去掉监视列表中的序号为 N 的变量的常显示 |
| 查看变量 | p + Name | 打印变量的值,不会常显示 |
| 修改变量 | set + Name | 设置指定变量的值 |

| 名称 | 命令 | 解释 |
|---|---|---|
| 结束当前函数 | finish | finish 会直接结束当前函数的调用,并停止在函数返回位置 |
| 继续运行 | continue | continue 继续运行至下一个断点,相当于F5 |
| 运行至指定行 | until + N | 运行至当前函数内部的第 N 行 |

| 名称 | 命令 | 解释 |
|---|---|---|
| 调用堆栈 | breaktrace/bt | 查看程序各级栈帧的调用情况 |
之前在 IDE 中写代码时,没有关心过文件的编译顺序以及代码的依赖关系,因为 IDE 可以自动构建项目。
工程中的源文件不计其数,按类型、功能和模块放在若干目录中。
Makefile 可以指定编译顺序,甚至更复杂的操作。使用 make 指令就可以自动编译项目,前提是所在目录下有Makefile 文件。
target : requires
command
| 名称 | 介绍 |
|---|---|
| target | 需要生成的目标文件 |
| requires | 生成目标文件所依赖的文件 |
| command | make 需要执行的命令 |
Makefile 指明了编译代码的两个要素:依赖关系和依赖方法。
mytest:mytest.c # 依赖关系
gcc -o mytest_make mytest.c -std=c99 # 依赖方法
.PHONY:clean
clean:
rm -f mytest_make
Makefile 默认第一个目标的是真目标,其他都是伪目标,输入 make 命令默认执行真目标。
.PHONY是一个关键字,表示目标总是可执行的,就是在依赖文件没发生更改的情况下,也可以执行该目标。
Makefile中可使用特殊符号:$@代表目标文件,$^代表其后指定的所有依赖文件。
Makefile 只会编译被修改的或者未编译的源文件,以节省时间。

由上图可以看出,
.out文件依赖.o文件,.o文件依赖.s文件,.s文件依赖.i文件,.i文件依赖.c文件。gcc -option hello.* -o hello.*。mycode : mycode.o
gcc -o mycode.o -c mycode.s
mycode.s : mycode.i
gcc -o mycode.s -S mycode.i
mycode.i : mycode.c
gcc -o mycode.i -E mycode.c
.PHONY:clean
clean:
rm -rf mycode mycode.o mycode.s mycode.i
执行 .out 依赖 .o,执行 .o 依赖 .s,执行 .s 依赖 .i,执行 .i 依赖 .c 文件,找到 .c 后再一步一步反向编译到可执行文件。
Makefile 文件可以像上述这样将所有步骤写出来,但一般不这样写,写的越简单越好。

| 创建命令 | 解释 |
|---|---|
| git init | 新建版本库 |
| git clone | 克隆版本库 |
| 提交命令 | 解释 |
| git add | 添加文件到暂存区 |
| git commit -m ‘xx’ | 将暂存区文件提交至本地仓库 |
| git push | 同步代码至远程仓库 |
| git pull | 下载代码至本地仓库 |
| git rm | 删除工作区文件。 |
| 查看命令 | 解释 |
| git status | 查看仓库当前的状态,显示有变更的文件 |
| git log | 查看仓库提交历史 |
| git blame | 以列表形式显示文件修改记录 |
| git diff | 比较暂存区和工作区文件的差异 |
| 分支命令 | 解释 |
| git branch | 查看本地所有分支 |
| git branch -r | 查看远程所有分支 |
| git checkout | 切换所有分支 |
| git merge | 合并分支 |
| git branch -d | 删除分支 |
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub
我正在玩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
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。 准备工作: 1、U盘一个(尽量使用8G以上的U盘)。 2、一台正常联网可使用的电脑。 3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。 4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。 U盘启动盘制作步骤: 注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,