除了vim, 还有哪些常用的牛逼的编辑器,除了gcc, 还有哪些常用的牛逼的编译器,为什么调试的时候需要编译选项中添加 -g,调研readelf命令,Linux下实现进度条程序.

除了vim, 还有哪些常用的牛逼的编辑器

Brackets

Brackets也是一款为Linux开发者设计的开源代码编辑器,使用Brackets写代码,你不会被任何事情所打断。比如在写HTML代码时,即便你没有保存代码也可以及时预览你的Web页面效果。你也可以使用Theseus来检查变量,Brackets默认提供一种主题,当然你也可以在扩展中心获取更多的主题。Brackets也是一款为Linux开发者设计的开源代码编辑器,使用Brackets写代码,你不会被任何事情所打断。比如在写HTML代码时,即便你没有保存代码也可以及时预览你的Web页面效果。你也可以使用Theseus来检查变量,Brackets默认提供一种主题,当然你也可以在扩展中心获取更多的主题。 

Chocolat

Chocolat本身是Mac OS X的最佳代码编辑器。该编辑器旨在与OS无缝集成,Chocolat为JS、Python和HTML提供拖放功能、拆分编辑、代码折叠和代码完成。其他一些功能是:广泛搜索和替换、错误检查。

Dart Editor

Dart Editor是Google开发设计的,旨在帮助开发者制作光亮而惊叹的Web应用。Dart Editor支持多种开发语言,同时也集成了Dartium。通过它的静态分析引擎,你可以创建,维护,调试和开发自己的Web应用。函数、类、方法等都能以树的结构列出来,方便你编写代码。

 Eclipse

Eclipse是一款很酷的开源代码编辑器,同时它也是最受程序员亲睐的代码编辑器之一,它拥有代码高亮和智能提示等强大的功能。在Eclipse中,你可以完全胜任以下编程语言的工作—&mdashython, R, Ruby, JavaScript, Natural, Lasso, C, C++, COBOL, Scheme, Clojure, Groovy等等,它也是非常著名的Java集成开发环境,甚至提供了对Java 8的支持。在一些Web开发IDE特性的帮助下,你可以非常方便地对代码文件进行组织和访问。

 Emacs

Emacs不仅仅是一个编辑器,他是一个整合环境,或可称它为集成开发环境,这些功能如让使用者置身于全功能的操作系统中。Emacs不仅可以作为文本编辑器,还可以用来收发电子邮件、通过FTP/TRAMP编辑远程档案、通过Telnet登录主机、上新闻组、登陆IRC和朋友交流、查看日历等功能。

Emacs是伪装成编辑器的操作系统。Emacs其实是个Lisp的解释器,因此可以用Lisp灵活地扩展。 Lisp是什么东西,这同样是种很有生命力的编程语言。在C语言还没有发明的年代,MIT的人工智能实验室写ITS操作系统时,一部分用的是汇编语言,还有一部分就是用的Lisp。现在,Lisp仍在人工智能研究领域广泛使用着。有这么牛逼的扩展语言,注定Emacs向着无所不能的方向发展。渐渐地,人们用Emacs不再限于写程序,写文档,而且在Emacs里管理文件系统,运行终端,收邮件,上网,听音乐……

Light Table

Light Table将会是一款彻底改变Linux编辑器概念的代码编辑器,它提供了直观和易用的编程界面。并且Light Table可以很方便地进行定制功能,因为它也是开源的。它有一个强大的插件管理器,这样你就不用在网上漫无目的的寻找需要的插件了。

 Sublime Text 3

这是一款绝对值得一提的Linux代码编辑器,因为它有简单而且超酷的功能特性。Sublime Text 3最独特的地方就是它没有独特的功能,它仅仅是一个简单的代码编辑器,有了它,你就可以非常方便地对多行代码进行修改了。利用Sublime Text 3你可以做操作文件、重命名变量、分离编辑和其他有趣的操作。

除了gcc, 还有哪些常用的牛逼的编译器

  • Viual C++

    Visual C++6.0不仅是一个C++编译器,而且是一个基于Windows操作系统的可视化集成开发环境(integrated development environment,IDE)

  • Borland C++

    这是由Borland公司出品。该公司的编译器以速度快、占用空间少著称。Borland C++ Builder和Borland C++ Builder X这两种开发工具用的就是这个编译器。

  • GNU C++
    这是GNU项目里面的著名开源编译器,是类UNIX系统下编写C++首先的编译器。其特点是可移植性好,可以在广泛的平台上使用它,是跨平台嵌入式系统开发的首选。在兼容性方面,GCC3.3达到了96.15%。

  • Inter C++

    它是针对Intel x86体系结构的CPU特别优化定制的,换句话说就是,它是基于Intel的处理器内核而开发的。此编译器对于高性能数值运算这种环境下的优势很明显,可以不优化代码的情况下就能提升程序的性能。

  • Clang

    Clang是一个C语言、C++、Objective-C、Objective-C++语言的轻量级编译器。源代码发布于BSD协议下。Clang的优势有:

    1. 编译速度很快,相当于GCC的1/3 ~1/4
    2. 编译过程消耗的内存不大
    3. 中间产出物和最终链接产物也不大,相当于GCC的1/3~1/4
    4. 出错信息可读性更强
    5. 代码结构清晰,可以作为库使用,成为其它 app(主要是 IDE)的内嵌 C/C++ parser

现在主流或者说是常见的编译器有四种:

1、Visual C++:这可能是大家用的最多的。不用说也知道是微软家的。Visual C++ 6.0可能是学C++的人最熟悉不过的了,不过6.0出来的时候,它的编译器对C++标准的兼容性比较低,只有70%左右。当然,这有其历史原因,Visual C++6.0出生的时候,C++标准还没出来呢~。Visual C++编译器发展到现在对C++标准的兼容性已经很好了,可以达到98%左右。

2、Borland C++:这是由Borland公司出品。该公司的编译器以速度快、占用空间少著称。Borland C++ Builder和Borland C++ Builder X这两种开发工具用的就是这个编译器。

3、GNU C++:又名GCC。这是GNU项目里面的著名开源编译器,是类UNIX系统下编写C++首先的编译器。其特点是可移植性好,可以在广泛的平台上使用它,是跨平台嵌入式系统开发的首选。在兼容性方面,GCC3.3达到了96.15%。

4、Intel C++:从名字就可以知道此编译器的主人了。它是针对Intel x86体系结构的CPU特别优化定制的,换句话说就是,它是基于Intel的处理器内核而开发的。此编译器对于高性能数值运算这种环境下的优势很明显,可以不优化代码的情况下就能提升程序的性能。

为什么调试的时候需要编译选项中添加 -g

默认编译生成的可执行文件是无法使用 gdb 来跟踪或调试的,因为可执行程序中没有可供 gdb 调试使用的特殊信息,为了将必要的调试信息整合到可执行文件中,我们便需要用到 -g 选项,这样生成的可执行程序,倘若出现问题,便可以使用 gdb 找出问题具体出现的位置,便于问题的解决。

加上-g选项以后,gcc在编译是会做以下额外的操作:

  1. 创建符号表,符号表包含了程序中使用的变量名称的列表。

  2. 关闭所有的优化机制,以便程序执行过程中严格按照原来的C代码进行。

调研readelf命令

readelf命令用来显示一个或者多个elf格式的目标文件的信息,可以通过它的选项来控制显示哪些信息。这里的elf-file(s)就表示那些被检查的文件。可以支持32位,64位的elf格式文件,也支持包含elf文件的文档(这里一般指的是使用ar命令将一些elf文件打包之后生成的例如lib*.a之类的“静态库”文件)。 

这个程序和objdump提供的功能类似,但是它显示的信息更为具体,并且它不依赖BFD库(BFD库是一个GNU项目,它的目标就是希望通过一种统一的接口来处理不同的目标文件),所以即使BFD库有什么bug存在的话也不会影响到readelf程序。 

运行readelf的时候,除了-v和-H之外,其它的选项必须有一个被指定。 

ELF文件有下面三种类型:
1.目标文件

$ gcc -c test.c
得到的test.o就是目标文件,目标文件通过链接可生成可执行文件。
静态库其实也算目标文件,静态库是通过ar命令将目标打包为.a文件。
如:ar crv libtest.a test.o

2.可执行文件
$gcc -o test test.c
得到的test文件就是可执行的二进制文件。

3.共享库
$ gcc test.c -fPIC -shared -o libtest.so
得到的文件listtest.so就是共享库。

我们以可执行文件为例来分析一下readelf命令。

gcc -o test test.c

生成可执行文件test。

readelf -h test

下面是输出结果:

1.根据Class、Type和Machine,可以知道该文件在x86-32位机器上生成的32位可执行文件。
2.根据Entry point address,可以知道当该程序启动时从虚拟地址 0x8048300处开始运行。这个地址并不是main函数的地址,而是_start函数的地址,_start由链接器创建,_start是为了初始化程序。通过这个命令可以看到_start函数,objdump -d -j .text test
3.根据Number of program headers,可以知道该程序有8个段。
4.根据Number of section headers,可以知道该程序有30个区。
区中存储的信息是用来链接使用的,主要包括:程序代码、程序数据(变量)、重定向信息等。比如:Code section保存的是代码,data section保存的是初始化或未初始化的数据,等等。

Linux内核无法以区的概念来识别可执行文件。内核使用包括连续页的VMA(virtual memory area)来识别进程。在每个VMA中可能映射了一个或多个区。每个VMA代表一个ELF文件的段。
那么,内核如何知道哪个区属于某个VMA(段)?映射关系保存在Program Header Table(PHT)中。

下面查看区的内容,

readelf -S test

.text区存储的是程序的代码(二进制指令),该区的标志为X表示可执行。

下面一些指令有兴趣的可以尝试一下,因为个人比较懒,就不每个都配截图了。

使用objdump反汇编查看.text的内容:
$objdump -d -j .text test
-d选项告诉objdump反汇编机器码,-j选项告诉objdump只关心.text区。

使用objdump反汇编查看.data的内容:
$objdump -d -j .data test
.data区保存的是初始化的全局变量。 

 使用objdump反汇编查看.bss的内容:
$objdump -d -j .bss test
.bss区保存的是未初始化的全局变量,linux会默认将未初始化的变量置为0。

下面命令可以看到test文件中所有的符号:
$readelf -s test
Value的值是符号的地址。 

 下面命令来查看文件的段信息:
$readelf -l test
区到段的映射,基本上是按照区的顺序进行映射。
如果Flags为R和E,表示该段可读和可执行。
如果Flags为W,表示该段可写。
VirtAddr是每个段的虚拟起始地址。这个地址并不是位于真正内存上的地址(物理地址)。 --------------------- 本文来自 Read_ever 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/linux_ever/article/details/78210089?utm_source=copy

在Linux下实现进度条程序. 通过makefile进行编译. 建议自主完成一个彩色的进度条. 

输入make

再输入./proc

可以看到进度条:

 

调研Linux下软件安装的几种方式(源码安装, rpm安装, yum安装)

下面这位高手的博客里有软件安装的具体过程。

https://blog.csdn.net/u012501054/article/details/77880139

1.源码安装。源码安装的步骤:编译源码,然后安装

<1>安装准备

a.首先用yum安装gcc,用于编译源码

b.官网下载源码包

c.winSCP  windows与linux传输文件(如果直接用要安装的linnux电脑下载就不用传输了)

<2>安装过程

  • 解压
  • 进入解压后的目录配置软件 ./configure#大多数情况下源码包都会带configure这样一个配置工具,具体使用方法可以vim查看其内容 。
  • make #编译源码包,如果报错了make clean清除缓存重新make
  • make install #安装,然后删除源码包软件和安装目录。

<3>源码安装优点

  • 文档齐全
  • 因为可以定位到代码,所以debug方便
  • 本机兼容性最好(由于是本机编译的,只要编译通过,就没有各种库的依赖的问题)

<4>源码安装缺点

  • 编译比较麻烦
  • 缺乏自动依赖管理,软件升级麻烦

2. rpm安装

rpm安装就是:安装别人编译好的软件包。如果依赖的文件没有事先安装,软件无法安装成功。

rpm即Redhat Package Manager,Redhat的软件包管理方式,适用于rpm install命令。rpm不仅已经把软件源代码编译成二进制文件,而且还对软件包依赖的软件,系统环境等做了统计。文件扩展名:rpm。还有一种SRPM:没有编译成二进制文件,但是也包含rpm的特性。

3.yum安装

为了解决rpm的问题,推出yum方式。既然依赖的软件没有安装在机器上,那么就先安装依赖的文件,再安装需要安装的软件。因此yum在安装软件同时安装依赖软件。因此需要一个yum源来放依赖的软文件,对比被安装机器上rpm软件库。yum也是基于rpm的。

猜你喜欢

转载自blog.csdn.net/qq_41209741/article/details/82882248