Week2学习过程报告

1、学习内容javascript

1. 熟悉Linux系统下的开发环境   
2. 熟悉vi的基本操做   
3. 熟悉gcc编译器的基本原理   
4. 熟练使用gcc编译器的经常使用选项   
5 .熟练使用gdb调试技术   
6. 熟悉makefile基本原理及语法规范   
7. 掌握静态库和动态库的生成java

2、学习记录shell

一、Linux下C语言编程环境概述编程

包含:编辑器(vim)、编译连接器(gcc)、调试器(gdb)、项目管理器vim

二、vi的模式缓存

1)vi的模式:命令行模式、插入模式、底行模式并发

a.命令行模式:用户能够上下移动光标进行删除字符或者整行删除等,或进行复制、粘贴等,但没法编辑文字。编辑器

b.插入模式:用户能够进行文字编辑输入,用户按[esc]可回到命令行模式。函数

c.底行模式:光标位于屏幕的底行,用户能够进行文件保存或退出操做,也能够设置编辑环境,如寻找字符串、列出行号等。工具

三、vi的基本流程

(1)进入 vi,即在命令行下键入“vi hello”(文件名)。此时进入的是命令行模式,光标位于屏幕的上方

(2)在命令行模式下键入 i 进入插入模式,如图 3.3 所示。能够看出,在屏幕底部显示有“插入”表示插入模式中的输入状态,在该模式下能够输入文字信息。

(3)最后,在插入模式中,按“Esc”键,则当前模式转入命令行模式,并在底行行中输入“:wq”(存盘 退出)进入底行模式,如图 3.4 所示。
这样,就完成了一个简单的 vi 操做流程:命令行模式→插入模式→底行模式。

四、 vi的各模式功能键

1)命令行模式功能键:

2)插入模式功能键:按“Esc”键可回到命令行模式 

3)底行模式功能键:

:wq!:强制保存并退出

五、gcc编译器所支持编译源文件的后缀及其解释

 

六、gcc 编译流程解析:预处理、编译、汇编、连接

Linux的可执行文件并无像 Windows 那样有明显的.exe后缀名, 只需向其分配x(可执行)权限便可 sudo chmod u+x excutefile

gcc的-E参数可让gcc在预处理结束后中止编译过程。

将hello.i编译为目标代码,gcc默认将.i文件当作是预处理后的C语言源代码,所以它会直接跳过预处理,开始编译过程。

gcc预处理源文件的时候(第一步),不会进行语法错误的检查。语法检查会在第二步进行,好比花括号不匹配、行末尾没有分号、关键字错误等。

1)预处理阶段:在该阶段,对包含的头文件(#include)和宏定义(#define、#ifdef 等)进行处理。在上述代码的预处理过 程中,编译器将包含的头文件 stdio.h 编译进来,而且用户可使用 gcc 的选项“-E”进行查看,该选项的 做用是让 gcc 在预处理结束后中止编译过程。

例如:[root@localhost gcc]# gcc –E hello.c –o hello.i

选项“-o”是指目标文件,“.i”文件为已通过􏰄处理的 C 程序。

(gcc 指令的通常格式为:gcc [选项] 要编译的文件 [选项] [目标文件] 其中,目标文件可缺省,gcc 默认生成可执行的文件,名为:编译文件.out)

2)编译阶段:接下来进行的是编译阶段,在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以肯定代码实际要作的工做,在检查无误后,gcc 把代码翻译成汇编语言。用户可使用“-S”选项来进行查看, 该选项只进行编译而不进行汇编,结果生成汇编代码。 

[root@localhost gcc]# gcc –S hello.i –o hello.s 

3)汇编阶段:汇编阶段是把编译阶段生成的“.s”文件转成目标文件,读者在此使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了。 

[root@localhost gcc]# gcc –c hello.s –o hello.o 

4)连接阶段:在成功编􏰂以后,就进入了连接􏰁段。 系统把函数的实现都放到名为 libc.so.6 的库文件中去了,在没有特别指定时, gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是连接到 libc.so.6 􏰃数库中去,这样就能􏰇使用各种函数了,而这也正是连接的做用。 

􏰃函数库有􏰈静态库和动态库两种。静􏰈态库是指编􏰂译连接时,将库文件的代码所有加入可执行文件中,所以生成的文件比较大,但在运行时也就再也不须要库文件了。其后􏰉名一般为“.a”。动态库与之相反,在编译􏰂连接时并无将库文件的代码加入可执行文件中,而是在程序执行时加载库,这样能够节省系统的开销。通常动态库的后􏰉名为“.so”,如前面所述的 libc.so.6 就是动态库。gcc 在编译时默认使用动态库。 完成了连接以后,gcc 就能够生成可执行文件。

[root@localhost gcc]# gcc hello.o –o hello 

[root@localhost gcc]# ./hello 

七、gcc 编􏰂译选项 

gcc 有超过 100 个可用选项,主要包括整体选项􏰋􏰌和出错选项、优化选项和体系结构相关选项。

(1)经常使用选项

a.“-I dir”:“-I dir”选项能够在头文件的搜索路径列表中添加 dir 目录。因为 Linux 中头文件都默认 放到了“/usr/include/”目录下,所以,当用户但愿添加放置在其余位置的头文件时,就能够经过“-I dir” 选项来指定,这样,gcc 就会到相应的位置查找对应的目录。 

好比在“/root/workplace/gcc”下有两个文件,可在 gcc 命令行中加入“-I”选项:

[root@localhost gcc]# gcc hello1.c –I /root/workplace/gcc/ -o hello1 

gcc 就可以执行出正确结果 。

(在 include 􏰶􏰷中,􏰸<>􏰹表􏰺在􏰔􏰻􏰼􏰽中􏰾􏰿􏱀文件,􏰸􏰸􏰹􏰹表􏰺在本目 小知识 录中􏰾􏰿。􏱁在上􏱂中,可把 hello1.c 的􏰸#include<my.h>􏰹改成􏰸#include “my.h”􏰹,

􏱃不须要加上􏰸-I􏰹选􏰑了。)

(2)库选项

 

在 Linux 中的每 个程序都会连接到一个或者多个库,函数库有􏰈态库和动态库两种,􏰈态库是一系列的目标文件(.o 文件)的归􏰣文件(文件名格式为 libname.a),若是在编􏰂某个程序时连接􏰈态库,则连接器将会搜索􏰈态库,从中􏱜取出它所须要的目标 文件并直接复制到该程序的可执行二进制文件(ELF 格式文件)之中;动态库(文件名格式为 libname.so[.主 版本号.次版本号.发行号])在程序编􏰂时并不会被连接到目标代码中,而是在程序运行时才被载入。 

咱们所编写的.c文件均可以制做一个􏰃函数库。过程以下:

 a.静态库的建立和使用

使用归档工具ar将一些目标文件集成在一块儿。例如:

[root@localhost lib]# gcc -c haha.c

[root@localhost lib]# ar rcsv libpow.a haha.o

a - haha.o

下面编译主程序,它将会连接到刚生成的静态库haha.a:

[root@localhost lib]# gcc -o heihei heihei.c -L. -lpow

[root@localhost lib]# ./heihei 2 10

2^10=1024

其中,选项“-L dir”的功能与“-I dir”相似,可以在库文件的搜索路径列表中添加 dir 目录,而“-lname” 选项指示编译􏰂时连接到库文件 libname.a 或者 libname.so。本实例中,程序heihei.c 须要使用当前目录下的一个静􏰈态库 libpow.a。

b.动态库的建立和使用

数显使用gcc的-fPIC选项为动态库创造一个目标文件:

[root@localhost lib]# gcc -fPIC -Wall -c haha.c

接下来使用-shared选项和已建立的位置无关目标代码,生成一个动态库libpow.so

[root@localhost lib]#  gcc -shared -o libpow.so haha.o

下面编译主程序,它将会连接到刚生成的动态库libpow.so

[root@localhost lib]# gcc -o heihei heihei.c -L. -lpow

在运行可执行程序以前,须要注册动态库的路径名。其方法有几种:修改/etc/ld.so.conf 文件,或者修改 LD_LIBRARY_PATH 环境􏰦变量,或者将库文件直接复制到/lib 或者/usr/lib 目录下(这两个目录为系统的默认的库路径名)。 

[root@localhost lib]# op libpow.so /lib

[root@localhost lib]# ./heihei 2 10

2^10=1024

动态库只有当使用它的程序执行时才被连接使用,而不是将须要的部分直接编􏰂入可执行文件中,而且一 个动态库能够被多个程序使用故可称为共享库,而􏰈静态库将会整合到程序中,所以在程序执行时不用加载静态库。 从而可知,连接到􏰈静态库会使用户的程序􏰧􏰨,而且难以升级,可是可能会比较容易部署􏰩。而 连接到动态库会使用户的程序轻便,而且易于升级,可是会难以部署􏰩。

(3)告警和出错选项

a.“-ansi”

该选项强制 gcc 生成标准语法所要求的􏰋􏰌告警信息,尽管这还并不能保证全部没有警告􏰌􏰋的程序都是符合 ANSI C 标准的。没法发现无效数据类型的错误。如(long long)

b.“-pedantic”

打􏰵印ANSI C标准所列出的所有警告􏰌􏰋信息,一样也保证全部没有警告􏰌􏰋的程序都是符合ANSI C标准的。 可以查出无效数据类型的错误。

c.

“-Wall”
打􏰵印gcc 可以􏱜供的全部有用的􏲙􏰌报警信息。 可以找出未使用的变量,但不能找出无效数据类型的错误。

另外,gcc 还能够利用选项对单独的常见错误分别指定警告􏰌􏰋。

(4)优化选项

gcc 能够对代码进行优化,它经过编􏰂选项“-On”来􏱎制优化代码的生成,其中 n 是一个表明优化级别的整数。对于不一样版本的 gcc 来说,n 的取值􏰝􏵙范围及其对应的优化效果可能并不彻底相同,比较􏵚典型的􏰝􏵙是从0变化到2或3。 

不一样的优化级别对应不一样的优化处理工做。如使用优化选项“-O”主要进行线程􏱆跳转(Thread Jump)和􏱇 􏱈延迟退栈(Deferred Stack Pops)两种优化。使用优化选项“-O2”除了完成全部“-O1”级别的优化以外,同时还要进行一些􏱊额外的􏰇调整工做,如处理器指令􏰇度等。选项“-O3”则还包括循环展开和其余一些与处理器特性相关的优化工做。 

(5)体系结构相关选项 

 

 

八、gdb调试器

gdb 调试器是一款 GNU 开发组织并发布的 UNIX/Linux 下的程序􏰇调试工具。

它能够实现:

  1. 启动程序,能够按照用户自定义的要求为所欲为的运行程序。
  2. 可以让被调试的程序在用户所指定的调试的断点处停住 (断点能够是条件表达式)。
  3. 当程序停住时,能够检查此时程序中所发生的事。
  4. 动态地改变程序的执行环境。
  5. 从上面来看,gdb和通常的调试工具区别不大,基本上也是完成这些功能,不过在细节上,会发现gdb这个调试工具的强大。你们可能习惯了图形化的调试工具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。­­­­­­­­­­­­­­­­­­­­­­­­­­­

(1) $ gdb testgdb <---------- 启动gdb

(gdb) break 16 <-------------------- 设置断点,在源程序第16行处。

(gdb) break func <-------------------- 设置断点,在函数func()入口处。

(gdb) info break <-------------------- 查看断点信息。

(gdb) r <--------------------- 运行程序,run命令简写

(gdb) n <--------------------- 单条语句执行,next命令简写。

(gdb) c <--------------------- 继续运行程序,continue命令简写。 Continuing.

(gdb) p i<--------------------- 打印变量i的值,print命令简写。

(gdb) bt <--------------------- 查看函数堆栈。

(gdb) finish <--------------------- 退出函数。

(gdb) c <--------------------- 继续运行。

(gdb) q <--------------------- 退出gdb。

(2)gdb主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,必需要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的 -g 参数便可。例如:

$ gcc -g hello.c -o hello

$ g++ -g hello.cpp -o hello

若是没有-g,将看不见程序的函数名和变量名,代替它们的全是运行时的内存地址。当用-g把调试信息加入,并成功编译目标代码之后,看看如何用gdb来调试。

启动gdb的方式以下:

  1. gdb <program> program也就是执行文件,通常在当前目录下。
  2. gdb <program> core 用gdb同时调试一个运行程序和core文件,core是程序非法执行后,core dump后产生的文件。
  3. gdb <program> <PID> 若是程序是一个服务程序,那么能够指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试它。program应该在PATH环境变量中搜索获得。 gdb启动时,能够加上一些gdb的启动开关,详细的开关能够用gdb -help查看。下面只列举一些比较经常使用的参数: -symbols <file> -s <file> 从指定文件中读取符号表。 -se file 从指定文件中读取符号表信息,并把它用在可执行文件中。 -core <file> -c <file> 调试时core dump的core文件。 -directory <directory> -d <directory> 加入一个源文件的搜索路径。默认搜索路径是环境变量中PATH所定义的路径。

九、makefile

$ vim Makefile

有了这个Makefile,不论何时修改源文件,只要执行一下make命令,全部必要的从新编译将自动执行。make程序利用Makefile中的数据,生成并遍历以test为根节点的树;

test(目标文件):prog.o code.o(依赖文件列表)

   tab(至少一个tab的位置) gcc prog.o code.o -o test(命令)

  .......

一个Makefile文件主要含有一系列的规则,每条规则包含一下内容:

一个目标,即make最终须要建立的文件,如可执行文件和目标文件;

目标也能够是要执行的动做,如‘clean’;

一个或多个依赖文件的列表,一般是编译目标文件所须要的其余文件。

以后的一系列命令,是make执行的动做,一般是把指定的相关文件编译成目标文件的编译命令,每一个命令占一行,并以tab开头(初学者务必注意:是tab,而不是空格)

执行以上Makefile后就会自动化编译

如:

$ make

gcc -c prog.c -o prog.o

gcc -c code.c -o code.o

gcc prog.o code.o -o test

最后就会多产生: porg.o code.o test这三个文件,执行./test查看结果

make clean会执行rm -f *.o test这条命令,完成 clean 操做。

Makefile还能够定义和使用宏(也称作变量),从而使其更加自动化,更加灵活,在Makefile中定义宏的格式为:

macroname = macrotext

使用宏的格式为:

$(macroname)

================================================================

实验楼操做笔记:

一、从教程vimtutor中退出只需输入":q!"

二、h:光标左移,l:光标右移,j:光标下行,k:光标上行

三、x:删除光标处字符

四、i:在光标处前一个位置插入字符

五、esc:恢复为正常状态

六、a:在光标位置输入文本

七、wq:保存文本后并退出

八、dw:删除以光标所在位置开头的单词

九、d$:删除从光标处直至末尾的部分文本

十、删除讲解:

十一、dd:删除一整行;2dd:删除两整行

12:u:撤销上一次操做;U:撤销一整行所有操做;Ctrl-R:撤销撤销动做

1三、dd删除后的句子会缓存至vim中,用p在欲插入粘贴的位置上方课将上一次剪切的句子贴入

1四、r:用光标指向修改部位,r,而后输入欲改成的字符。完成替换

1五、c$:更正至光标位置起到句末的部分

1六、shift-g:跳转至指定行;Ctrl-g:查看文件信息和当前信息

1七、/+字符:自动在文本中向下搜索关键词,?+字符:自动在文本中向上搜索关键词,n向后继续查找。Shift-n为向上查找。

1八、%:括号匹配查看

1九、:s/old/new:用new替换文本中第一个相符字符串;:s/old/new/g:替换整行中的相符字符串;#,#s/old/new/g:替换两行间的匹配串;:%s/old/new/g:替换整个文件中的匹配串;:%s/old/new/gc:进行全文替换时需询问用户确认

20、Shift+zz:保存退出vim

2一、行间转换:

 

2二、行内转换:

2三、~:将小写字母变为大写

2四、复制粘贴和剪切:

2五、ddp:交换上下行

2六、替换和撤销:

2七、使用命令进行快速调整缩进操做

2八、shiftwidth命令

shiftwidth命令是指>>命令产生的缩进(能够简写成sw) 普通模式下输入:进入命令行模式下对shiftwidth值进行设置能够控制缩进和回退的字符数获取目前的设定值

:set shiftwidth?查看缩进值默认值;:set shiftwidth=n设置缩进值

2九、设置文本位置

命令行模式下输入:ce(center)命令使本行内容居中

命令行模式下输入:ri(right)命令使本行文本靠右

命令行模式下输入:le(left)命令使本行内容靠左

30、高级查找

3一、同时建立两个新文件并编辑:$ vim 1.txt 2.txt

默认进入1.txt文件的编辑界面

进入vim后打开新文件

恢复文件:vim -r进入文档后,输入:ewcover 1.txt

3一、可视模式选取

3二、视窗操做

:new 打开一个新的vim视窗,并进入视窗编辑一个新文件

3三、文档加密:$ vim -x file1

3四、在vim执行外部命令:在命令行模式中输入!能够执行外部的shell命令

3五、vim中的查看帮助

3六、vim的功能设定:能够在编辑文件的时候进行功能设定,如命令行模式下输入:set nu(显示行数),设定值退出vim后不会保存。要永久保存配置须要修改vim配置文件。 vim的配置文件~/.vimrc,能够打开文件进行修改,不过务必当心不要影响vim正常使用

3七、获取目前的设定

3八、set功能的说明

3九、vim进入编译器后并不会打开任何文件,可是能够经过:e 文件路径进入某指定文件

40、I:在行首插入

4一、A:在行末插入

4二、o:在当前行后插入一个新行;O:在当前行前插入一个新行

4三、X:删除游标所在前一个字符

4四、d^:删除至行首

4五、dG:删除到文档结尾处;dlG删除至文档首部

4六、.表示重复上一次的命令操做

4七、Ctrl+o:跳转回上次光标的位置

 

=============================================

遇到的问题:

一、在vim教程中,想练习:wq保存文件后退出时,老是将命令错误输入在以下图的小框内,而后后来使用:q!退出小框后再次输入:wq<Enter>后就成功了。

二、在Linux实验GCC的使用这一节中,最后让咱们试编译hello.h、hello_print.c、hello_main.c三个文件时,输入$gcc hello_print.c hello_main.c -o hello会报错,以下图:

我尝试在hello_main.c中加入#include<stdio.h>,再也不报错。可是却没有输出“Hello,Shi-Yan-Lou”。

后来我删掉了以上修改,从新编译,却又不报错了。我以为很奇怪。并且也依旧没有输出。

三、makefile中按照实验指导操做却老是有报错,没法得出自动编译结果,频频出现“未定义调用myfun()"这样的提示。

相关文章
相关标签/搜索