视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Linux编程技术详解
2025-10-02 08:09:38 责编:小OO
文档
索引号:TP316.81/23

2.6.4 Linux平台下VMware WorkStation的安装(P24)

x:extract的缩写,表示解压

v:verbose的缩写,表示解压过程信息

z:解压gzip格式文件

f:force的缩写,表示强制,如果解压过程中出现问题,依然进行解压。

如果要将某个目录打包成tar文件,可以使用“tar cvf 文件名”命令,其中,c(create)表示创建文件。

tar xzf setup.tar.gz     #解开setup.tar.gz,不显示解压过程

为什么要使用./可执行文件名来运行当前目录下的可执行文件?出现安全性的考虑,Linux不把当前路径加入环境变量PATH中。

su -   #表示切换到管理员账号,同时把将shell环境也切换到管理员登录shell下。

mkdir hdb1   #创建名为hdb1的目录。

2.8 远程连接Linux服务器(P40)

具体操作参见P40~P43

2.8.4 开放X Window远程访问服务(P43)

如果要在Windows平台登录Linux的图形化界面,必须在Linux系统上开放相关服务,并在Windows系统上安装相关软件。如果要使Fedora Core或Ubuntu开放X Window服务,需要修改两个配置文件。

1)修改/etc/X11/xdm/Xaccess文件,将其中的“#*#any host can get a login window”语句句去除注释,即修改为“*#any host can get a login window”。

2)修改usr/share/gdm/defaults.conf(Fedora Core版本中)文件中将[xdmcp]中的Enable设置为true。(具体参见P44)

使用“netstat –an |grep 177”确认服务是否成功开启。

2.8.5 在Window系统中登录Linux图形用户界面(P44)

需要在本地安装一个X服务器,目前,使用较为广泛的是在Windows系统上安装Xmanage软件。具体操作参见P44~P45

3.1 文本编辑器:vi(P50)

Vim是Vi Improved的缩写。

输入“i”或“a”(大小写不限)可以进入插入模式或进入末行模式。

按“Esc”键退出插入模式进入命令模式。

3.1.3 vi编辑器的基本操作(P50)

vi支持使用键盘方向键和h、j、k、l键实现光标的移动(“h”键或向左方向键,“i”键或向上方向键,“j”键或向下方向键,“l”键或向右方向键)。

vi支持一些快捷移动方式如下:

(1)^:将光标定位到当前句的开关位置。要将光标移动到句子的开关,可以在命令模式下输入“^”。

(2)$:将光标移动到当前句的结束位置。

(3)nG:n表示要移动光标的行号,即第几行,该快捷方式可以将光标快速移动到指定行。

(4)G:将光标移动到最后一行。

(5)Ctrl+F:F表示Forward,向前翻动一页。

(6)Ctrl+B:B表示Backward,向后翻动一页。

(7)Ctrl+U:U表示Up,向前翻动半页。

(8)Ctrl+D:D表示Down,向后翻动半页。

3.1.4 末行模式下的常用命令(P52)

在命令模式下输入“:”将进入末行模式。

(1)w:保存文件。

(2)e文件名:打开该文件进行编辑。

(3)x:保存当前文件并退出。

(4)q:退出Vi

(5)q!:不保存修改,强制退出。

3.1.6 搜索及替换命令(P52)

(1)/pattern:从光标所在处搜索到文件结束位置,查找所有符合pattern的字符。

(2)?pattern:从光标所在处搜索到文件开始位置,查找所有符合pattern的字符。

(3)n:重复上一次查找。

(4)N:在相反的方向重复上一次查找。

(5):1,$s/old/new/g:将文件中所有的old字符替换成new字符,命令中“1”表示文件开关,“$”表示文件结束。

(6):n,ms/old/new/g:将第n行和第m行之间的old字符都替换成new字符。

(7):s/old/new/g:将当前行中的所有old字符替换成new字符。

3.1.7 Vi加密文件(P53)

当使用“vi –x文件名“时,进入vi将要求输入密码。其他编辑器同样无法打开vi加密过的文件。

在进入vi后,如果想对文件加密,在命令模式下输入“:X”即可。

3.1.8 在Vi中打开语法加亮和启用自动缩进功能(P53)

1.语法加亮

有两种方法打开语法加亮选项:

1)在末行模式下输入“syntax on”

2)修改/etc/vimrc文件将其中的“syntax on“前面的引号去掉即可。

2.自动缩进

使用“:set cindent”命令来启动自动缩进。

3.6 源代码阅读工具:SlickEdit(P68)(可以考虑下载)

具体安装操作参见P68~P70

3.8 Linux下的C/C++编译器(P71)

GCC不仅支持C语言,还支持Ada,C++,Java,Objective C,Pascal,COBOL等开发语言。

GCC的编译过程分为预处理、生成汇编代码、生成目标代码和链接成可执行文件等4个步骤。使用GCC编译代码时,可以通过参数控制其编译过程,让其停止在上述4个步骤之一。

3.8.3 使用GCC编译C代码(P72)

“gcc 代码文件名”,这时生成的二进制可执行文件名称为a.out。

也可以指定输出的文件名称,这时编译命令就变成了“gcc –o 代码文件名”。

//gcc –o executable_filename source_file

gcc –o p3 p3.c   #gcc根据给出的可执行文件名,生成了可执行文件。

GCC还支持显示编译过程的所有信息,使用参数v即可以显示GCC的工作整个过程。例如:

gcc –v –o p3 p3.c

使用GCC编译C++代码与编译C程序代码类似,惟一不同的就是要将gcc换成g++。

3.8.5 使用GCC控制编译过程(P74)

1.预处理

该步骤完成宏和include展开工作。在GCC中使用参数E可以控制GCC只完成预处理,而不进行其他编译工作。例如:

//使用参数E控制GCC只完成预处理,而不进行其他编译工作。

//使用参数o指定预编译后生成的文件名为p3.pre.c

gcc –E –o p3.pre.c p3.c   #生成名为p3.pre.c的文件

2. 生成汇编代码

编译器将预处理生成的代码进行处理,并根据编译参数进行优化,最后生成汇编代码。GCC使用参数S可以控制只完成编译的前两步。

//使用参数S控制GCC只完成预编译和生成汇编代码过程

//这里将生成名为p3.s的汇编代码

gcc –S p3.c    #生成p3.s的汇编代码

3. 生成目标代码

目标代码生成阶段是把中间代码变换成特定机器上的绝对指令代码、可重定位的指令代码或汇编指令代码。GCC中使用参数c完成预编译、生成汇编代码和生成目标代码。

//使用参数c控制GCC完成预编译、生成汇编代码和生成目标代码过程

gcc –c p3.c     #生成了p3.o目标代码

4. 链接生成最终可执行代码

gcc –o p3 p3.c

3.9 应用GNU Make实现项目管理(P76)

Make只编译改动的代码文件,而不用完全编译。

3.9.1 GUN Make介绍(P76)

Make根据一定的规则对项目的源文件进行编译,并生成可执行的二进制文件。

Make通过读入配置好的文本文件,并根据文本文件中预先定义的规则和步骤,完成代码的编译和链接工作,最终生成所需要的项目文件,这个文本文件在缺省情况下文件名为makefile或Makefile。

Make程序的命令形式是“make[选项]、[目标]..”,支持选项如表3.1所示:

表3.1 Make程序支持的命令选项

-b或-m

忽略兼容性
-B或-always-make

无条件编译所有目标
-d打印调试信息
-e或-environment-overrides

在makefile中不替换环境变量的值

-f FILE或--file=FILE

或--makefile=FILE

指定FILE文件为makefile

-h或-help

显示make命令帮助信息

-i或--ignore-errors

忽略命令中的错误信息
-I DIRECTORY或

--include-dir=DIRECTORY

搜索指定目录中的makefile文件

-k或--keep-going

即使某些目标无法编译,仍然继续编译工作
-o FILE,--old-file=FILE

或—assume-old=FILE

即使这些文件已经做过修改但仍然不编译该文件
-p或--print-data-base

打印make的内部数据库信息

-r或--no-builtin-rules

禁用编译中的隐式规则
-s或—silent或--quiet

不显示编译中的命令
-v或--version

显示make命令的版本号

当用户输入make命令后,Make将首先搜索该目录下时候存在makefile。如果没有找到,则搜索名为makefile的文件,最后查找名为Makefile的文件。

3.9.2 简单makefile示例

使用vim编写makefile文件,内容如下:

p3:p3.c

    gcc –o p3 p.c

将makefile文件保存在p3.c所在的同一目录,在shell中输入“make”,就可以对p3.c进行编译。

注意:在第二行的开头是tab字符,make中规定每一shell命令之前的开头必须使用字符,如果只是使用几个空格的话,会得到下面的提示:

makefile:2:***遗漏分隔符。停止

make会把后面的语句交给Shell来解释,其他的则由make自己来解释。

3.9.3 makefile的语法(P78)

makefile有严格的语法规定:

1)变量定义:和C语言类似,这些变量是区分大小写的。可以使用变量定义来指定具体的编译器参数,或保存要生成的文件名列表。

2)基于依赖关系的指令:指明要编译成功某个文件,需要编译的代码文件。

除了可以在makefile文件中定义变量外,还可以在makefile中使用一些预先设定的变量,如表3.2所示。

表3.2 makefile支持的预定义变量及其意义

变量名含义
$@表示当前规则中的目标文件名
$?新修改过的依赖文件列表
$*不包含扩展名的目标文件名
$<当前规则中的第一个依赖文件名
$%当目标文件为库文件时,该变量为库文件名;如果不是库文件,该变量为空值
$^当前规则中的所有文件列表
AR归档程序名称,默认为AR

ARFLAGS归档程序选项
CCC编译器命令名,默认为CC

CFLAGSC编译器编译参数

基于依赖关系的指令区:

p3:p3.c

    gcc –o p3:p3.c

第一行的p3被称为目标,而冒号后的p3.c为依赖文件。也就是说,生成目标p3依赖于冒号后的p3.c文件,在makefile中将这种形式的语句称为规则,规则的具体规定如下:

目标(可能存在多个目标)…:依赖文件(可能存在多个条件)…

命令(在makefile中,TAB后的命令将交给Shell来解释)

目标通常可以取为要生成的文件名,依赖条件是用来输入从而产生目标的文件,一个目标可以有几个依赖。

注意:目标还可以是某个动作,如果常使用make编译程序,一定注意在编译后,可以使用“make clean”将中间生成的的文件做必要的清理。这时,目标就没有依赖关系了,例如:

CC=gcc

CFLAGS=-o

p3:p3.c

    $(CC) $(CFLAGS) $@ p3.c

clean:

    rm p3

在Shell中输入make命令,然后执行make clean,即可将生成的p3清理掉。

为会么clean动作在make的时候没有被执行?

在正常情况下,如果没有告诉Make执行clean命令,clean将永远不被执行。这种没有任何依赖的规则、仅仅表达动作的目标称为假想目标。

3.9.4 Make工作流程(P80)

可以使用“make –f”来指定makefile文件,例如:在某目录下有一个针对p3.c编译的makefile文件:

//可以使用“make –f”参数指明按makefile.p3来编译代码

make –f makefile.p3

p3的makefile文件为:

CC=gcc

CFLAGS=-o

OBJFLAGS=-c

p3:p3.part1.o p3.part2.o p3.o

    ……

具体详细描述参见P80~P82

3.9.5 makefile的隐含规则(P82)

隐含规则可以认为是默认的约定或惯例。Make在makefile中没有指明具体处理规则时会采用惯例来处理。例如,将后缀为.c的文件编译为.o文件。

隐含规则会使用一些预定义的变量,这样可以通过改变这些预定义变量的值来定制使用隐含规则编译的具体参数。例如,改变CFLAGS变量可以控制编译的过程。如果不想隐含规则使用预定义的变量,可以使用选项R或no-builtin-varibles来删除所有的隐含规则中使用的变量。

通过make的隐含规则,即使在makefile中没有指定需要生成某个目标文件,依然会根据依赖关系自动调用gcc,完成目标文件的生成。

Make的隐含规则还支持一个目标对应多个依赖模式。如果出现目标文件由不同编译器编译实现的时候,Make会根据不同的源文件(判断依据主要是文件的后缀),调用不同的编译器完成编译。

具体详细描述参见P82~P84

Make在编译的时候,会使用如表3.3所示的隐含规则,这里只列出一些常见的规则。

表3.3常见隐含规则列表

规则说明
C程序编译

.o文件自动由同名的.c文件生成,编译命令为:$(CC)-c$(CPPFLAGS)

$(CFLAGS)

C++程序编译

.o文件自动由同名的.cc或同名的.c文件生成,编译命令为:$(CXX)-c$

(CPPFLAGS)$(CFLAGS),也就是说如果要让make对C++代码执行隐含规则,C++代码的后缀必须为.cc或.c

Pascal程序编译

.o文件自动由同名的.p生成,编译命令为:$(PC)-c$(PFLAGS)

3.9.6 makefile的模式规则(P84)

Make支持编写模式规则来定义用户自己的隐含规则,从形式上看,模式规则类似于一般的规则,只是含有“%”的通配符(“%”与Shell中的*功能类似,表示一个或多个任意的字符)。例如,一条内容是“%.o:%.c”的规则,意思是将所有.c结尾的文件编译成.o的目标文件。

如果确定了依赖关系中的“%”模式,Make会按要求去匹配当前目录下的所有文件名。一旦找到符合规则的文件,Make就会执行该规则下的命令。所以在模式规则中,目标可能会有多个。如果模式规则匹配出了多个目标,Make会按模式规则产生所有的目标。

在模式规则中,有时候给出的依赖关系并不包含“%”,这表示采用该规则创建的所有文件都采用相同的依赖关系。下面是一条在makefile中使用的模式规则:

%.o:%.c

        $(CC) –c $(CFLAGS) $(CPPFLAGS) $< -o $@

该模式规则表示当前目录下的所有以.c结尾的文件编译成以.o结尾的目标文件。命令中的“$<”将在执行该规则时被替换成符合该规则的代码文件,而“$@”将被替换成生成的目标文件。

注意:makefile中的函数和变量的展开在Make读取makefile时,而模式规则中的“%”展开是在运行时。下载本文

显示全文
专题