前段linux学习的小结,分享一下:)。
一、Linux C语言编程环境搭建
需要以下软件包
² gcc:编译器。
² cpp:源代码预处理
² libgcc:gcc必须的自身组件
² libc6:提供C语言运行所需的库文件和库文件操作命令
² binutils:提供辅助工具
/usr/bin/size:显示每个目标文件或归档文件的章节大小和总的大小
/usr/bin/ar:归档文件管理工具,可以创建、修改或打开一个归档文件
/usr/bin/objdump:显示目标文件的信息
/usr/bin/strings:显示一个文件中的可打印字符串
/usr/bin/ranlib:产生归档文件的索引
/usr/bin/objcopy:复制或转换目标文件
/usr/bin/addr2line:把一个地址信息转换为文件名和行号
/usr/bin/readelf:显示 ELF 文件信息, ELF 文件格式即 Linux 目前流行的可执行文件格式
/usr/bin/nm:显示目标文件里的符号
/usr/bin/strip:去除目标文件里的符号
/usr/bin/as:GNU 汇编工具
/usr/bin/ld:GNU 链接工具
/usr/bin/gprof:显示目标文件的profile数据
² locals:提供本地语言环境支持
² libc6-dev:提供c语言库libc、头文件
² manpages-dev:提供man手册
² make:维护源代码
² gdb :调试程序
² indent:格式化源代码
注:如有需要还可以安装以下软件包,以提供参考手册
² glibc-doc-reference
² glibc-doc
² make-doc
二、选择文件编辑工具
如果linux为文本界面,通常有以下几种选择:
1.使用linux提供的VI编辑器
常用命令:
vi filename:打开或新建一个文件
←→:光标左右移动
↑↓:光标上移/下移一行
i:在光标前插入文本
I:在当前行首插入文本
r:替换当前文本
R:替换当前字符以及其后的字符,至到按ESC
do:删至行首
d$:删至行尾
ndd:删除当前行及其后n-1行,删除1行的时候可以省略为dd
/pattern:从光标开始处向文件尾搜索pattern
?pattern:从光标开始处向文件首搜索pattern
n:在同一方向上重复上一次搜索命令
N:在相反方向上重复上一次搜索命令
g/p1/s//p2/g:将文件中所有p1替换为p2
最后行方式命令(处于其他模式的场合,按ESC后才可键入命令):
:q!:退出且不保存变更
:q:退出,如果有变更,会给出提示
:w:保存当前文件
:x:保存变更并退出
2. 在windows侧编辑文件,通过FTP工具上传到Linux机器。
3. 使用UltraEdit连接到linux上,把文件直接保存到Linux机器上
新建文件:
File->New新建一个文件
->File->FTP->Save As to FTP
->Accounts
->New 没有linux FTP acconut的场合,创建一个
->在Account下拉框中,选择使用的FTP account
->选择文件保存目录,最好一个程序一个目录
->选择传输类型:二进制方式
->输入文件名
->点击Save As,保存文件
打开一个既存文件:
File->FTP->Open From FTP
->在Account下拉框中,选择使用的FTP account
->选择文件目录
->选择传输类型:二进制方式
->双击选择的文件或点击Open
文件保存:
和一般文件相同。ctrl+s或点击保存按钮。
为了方便,新建一个工具栏,把Save AS To FTP、Open From FTP等添加到工具栏中。
三、程序文件作成
1.创建一个文件夹,用于存放程序文件和make文件。(便于管理)
2.作成头文件(.h文件,用于存放引用的头文件、宏定义、结构体定义、函数原型等)
注:最后一行空白
3.作成.c文件(程序实现)
注意:linux c的某些函数和windows不同。
最后一行空白
4.根据文件的依赖关系作成make文件Makefile。
⑴变量定义
通常会定义以下变量:
² CC=gcc 编译器选择
² SRC=a.c b.c 指定依赖的.c文件
² OBJ = $(SRC:.c=.o) 或OBJ=a.o b.o
指定依赖的object文件。$(SRC:.c=.o)是将所有SRC中的.c文件转换为对应的.o文件。
² HDR=a.h b.h 指定依赖的头文件
² INCDIR=-Idir11 -Idir2 指定头文件搜索目录
² LIBDIR=-Ldir1 -Ldir2 指定链接库搜索目录
² LIBR=-la -lb 引用库a, b
² CFLAGS= -g –Wall -O -Dmacro1 gcc选项:打开调试选项、输出所有警告信息、进行优化、定义宏macro1
² BIN=filename 指定最终输出物件的名字
⑵依赖关系
² 生成动态库的场合
all:依赖的Object文件$(OBJ) 最终生成物件$(LIB)
依赖的Object文件$(OBJ):源代码$(SRC):头文件$(HDR)
$(CC) -fPIC $(CFLAG) -c $(SRC)
最终生成物件$(LIB):源代码$(SRC) 依赖的Object文件$(OBJ)
$(CC) -shared $(CFLAGS) $(INCDIR) $(LIBDIR) –o$@ $(OBJ) $(LIBR)
² 生成静态库的场合
all:依赖的Object文件$(OBJ) 最终生成物件$(LIB)
依赖的Object文件$(OBJ): 源代码$(SRC):头文件$(HDR)
$(CC) $(CFLAG) $(INCDIR) -c $(SRC)
最终生成物件$(LIB): 源代码$(SRC):依赖的Object文件$(OBJ)
$(AR) r $@ $(OBJ)
注:AR=ar
² 生成可执行物件的场合
all:最终生成物件$(BIN)
最终生成物件$(BIN):源文件($SRC) 头文件($HDR)
$(CC) $(CFLAGS) $(INCDIR) $(LIBDIR) -o $@ $(SRC) $(LIBR)
⑶目标文件清空
在Makefile的最后,加入清空目标文件的规则
clean:
rm –f $(BIN) $(OBJ) 或 rm –f $(BIN) *.o
或者
.PHONY:clean
clean:
-rm -f $(BIN) $(OBJ) 或 -rm -f $(BIN) *.o
注:.PHONY显式的把clean声明为一个“伪目标”,是为了避免同一目录下存在一个名为clean的文件的场合下,make clean执行错误。
rm前加”-”:命令执行过程中某个文件出错的场合,继续执行
四、代码编译
1.执行make命令,编译代码。
为了方便查看输出信息,在make 后追加 &>filename,把标准输出和错误输出都写到指定文件中。如:make &>result
2.修改编译错误和警告,再次编译,直到编译通过。
错误定位的一些技巧
² 越是低级错误,影响范围越大。检查第一个错误之前的行是否以分号结尾,小括号、中括号、大括号是否匹配等。错误找到,修改后,立即重编代码。这下错误少了很多呢,心情是不是也跟着好起来了呢。
² 引用了未定义的系统函数:首先man一下,如果找到对应的手册,则可能是头文件没有引用或引用错误;如果没有找,则可能是Linux侧的函数名和windows侧的不同。
² 系统函数链接错误,Makefile gcc命令选项中是否指定了对应链接的库
五、程序执行
1.执行物件
直接在命令行执行生成物件,查看输出结果是否正确
命令:
./filename
文件绝对路径
2.动态库或静态库
作成可执行物件调用库函数,然后执行可执行物件
六、程序调试
1.一般可执行物件
gdb filename 启动gdb并载入程序
2.进程
² gdb -p 进程ID 或 gdb attach 进程ID
启动gdb并载入进程
² (gdb) set follow-fork-mode [parent | child]
设定fork之后继续调试父进程还是子进程
² (gdb) set detach-on-fork [ on | off]
指示gdb在fork之后是否断开(detach)某个进程的调试,或者都交由GDB控制
on: 断开调试follow-fork-mode指定的进程
off: gdb将控制子进程和父进程,follow-fork-mode指定的进程将被调试,另一个进程处于暂停(suspended)状态。
注:该命令是在gdb 6.6(包括)以后支持的
3.常用gdb调试命令
² list列出产生执行文件的源代码的一部分(10L)
list function列出某个函数
list 接着前一次继续显示
list linenumber 从行linemuber开始显示10L
² break 在代码里设置断点
break function 在函数入口设置断点
break linenumer 在当前源文件的行linenumber处设置断点
break file:linenmuber 在指定源文件file的linenumber行处设置断点
² next 执行一行代码,而不进入函数内部
² step 执行一行代码,并进入函数内部
² info 查看程序信息
info br 查看断点信息
² continue 继续执行,直到遇到下一个断点
² print 查看变量值,格式: print [/F] 参数 F为输出格式
常用格式:
x 16进制整数格式
d 有符号十进制整数格式
u 无符号十进制整数格式
f 浮点数格式
² set 修改变量的值,格式set 参数=值
² clear 删除一个断点,以函数名或行号作为参数
² disable 禁止某个断点,参数是断点在断点列表中的索引,使用info br可以看到
² enable 允许某个断点功能,参数同disable
² quit 终止 gdb
~完~
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/abu04/archive/2008/09/25/2975925.aspx