ImageVerifierCode 换一换
格式:DOC , 页数:27 ,大小:456KB ,
资源ID:7223749      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-7223749.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(达内Unixc编程.doc)为本站会员(11xg27ws)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

达内Unixc编程.doc

1、Unix环境与编译工具讲稿Version 1.0Unix Programming Environment int main()printf(“%d+%d=%dn“,34,68,add(34,68);return 0;代码ch01_1.c/* 函数实现 */int add (int a,int b)return a+b;编译脚本gcc -x c -o main -Wall ch01.c ch01_1.c注意:在调用处,最好加上显示add函数声明,否则会报一个警告(去掉-Wall不会警告)。Add函数的声明可以单独存放一个文件,就是头文件。思考:头文件的作用是什么?1.1.2.编译目标文件1.1.

2、2.1.编译成目标文件语法:gcc -c C源代码文件示例:方式一:每个C文件都生成一个目标文件gcc -c ch01.c ch01_1.c方式二:多个C文件生成一个目标文件gcc -o main.o -c ch01.c ch01_1.c1.1.2.2.使用目标文件编译语法:gcc o 输出文件名 目标文件1 目标文件1示例:方式一:编译多个目标文件gcc -o main ch01.o ch01_1.o方式二:编译一个目标文件gcc -o main main.o1.1.3.预处理1.1.3.1.预处理编译语法:gcc -E C源代码文件示例:gcc -E -o ch01.i ch01.c gc

3、c -E -o ch01_1.i ch01_1.c注意:预处理每次只能处理一个文件。不能处理多个文件,就是每个.c文件对应一个.i文件。不指定 o 选项,预处理的结果输出到标准输出设备。1.1.3.2.编译预处理文件gcc -o main ch01.i ch01_1.i1.1.3.3.预处理指令介绍在C语法中引入很多预处理指令,这些指令影响到gcc的预编译处理结果。预编译指示符号 说明#define 定义宏#elif else if 多选分支#else 与#if、#ifndef、#ifdef结合使用#error 产生错误,挂起预处理程序#if 判定#endif 结束判定#ifdef 判定宏是否

4、定义#ifndef 判定宏是否定义#include 将指定的文件插入#include的位置#include_next 与#include一样,但从当前目录之后的目录查找#line 指定行号#pragma 提供额外信息的标准方法,可用来指定平台#undef 删除宏#warning 创建一个警告# 连接操作符号,用于宏内连接两个字符串示例:1、 #define 、#undef#include /* 演示编译器gcc */#define YQ#define LOUIS “ENGLISH NAME“ int main()printf(“%sn“,LOUIS);/*#undef LOUIS*/print

5、f(“%sn“,LOUIS);return 0; 2、 #error、#warning#include /* 演示编译器gcc */int main()int a=20;if(a=2)/#error “错误很多“#warning “警告一下!“ return 0;3、#if、#elif、#else、#endif#include #define VERSION 3/* 演示编译器gcc */#if (VERSION #define DEBUG/* 演示编译器gcc */#ifdef DEBUG#warning “调试“#else#warning “非调试“#endif/这个指示符号的使用还是比较

6、广泛的int main()printf(“Hello gcc使用!n“); return 0;使用#ifdef、#define可以防止头文件二次引入。5、#include、#include_next说明:1.系统头文件使用#include 2.用户头文件使用#include “”规则:1.系统头文件会在I参数指定得目录中查找。2.用户头文件会在当前目录查找。3.Unix标准系统目录/usr/local/include/usr/lib/gcc-lib/版本/include/usr/include/usr/include4.编译C+优先查找/usr/include/g+v35.#include 会

7、在所有标准目录的子目录sys中查找time.h6.#include的文件名不不含扩展,*、?无意义。除非文件名中包含*。6.#line#include int main()int re=0;printf(“Hello gcc使用!n“); for(int i=0;i#pragma GCC dependency “ch02.c“int main()int re=0;printf(“Hello gcc使用!n“); int i;for(i=0;i#pragma GCC dependency “ch02.c“#pragma GCC poison printf addint main()int re=

8、0;printf(“Hello gcc使用!n“); int i;for(i=0;i#pragma GCC dependency “ch02.c“/#pragma GCC poison printf addint main()int re=0;printf(“Hello gcc使用!n“); int i;_Pragma(“GCC poison printf add“)for(i=0;i#pragma GCC dependency “ch02.c“/#pragma GCC poison printf add#define HELLO(a) a#200int main()int re=0;prin

9、tf(“Hello gcc使用:%s!n“,HELLO(99); return 0;1.1.3.4.预定义宏介绍预定义的宏很多,下面列出常用的。宏 说明_BASE_LINE_ 源代码的完整路径_cplusplus C+有效,程序不符合标准为1,否则是标准的年月_DATE_ 日期_FILE_ 源代码文件名_func_ 当前函数名_FUNCTION_ 同上_INCLUDE_LEVEL_ 包含层数,基本的为 0_LINE_ 行数_TIME_ 时间示例:#include int main()printf(“Hello gcc使用:%d!n“,_LINE_); printf(“Hello gcc使用:%

10、s!n“,_DATE_); printf(“Hello gcc使用:%s!n“,_BASE_FILE_);return 0;1.1.3.5.预处理与make 选项选项 说明-M 输出适合makefile 的规则-MD 同上,需要显示打开-E-MMD 与-M 同,但不列出头文件-MF 指定输出文件名,与MMD,-MM,-M结合使用-MG 假设头文件存在并不包含其他文件-MM 与-M 同,但不列出系统头文件-MP 与-M 或-MM使用,为每个包含文件生成哑目标-MT 与-M 或-MM使用,指定makefile规则的目标文件名示例:gcc -MG -MM -MF makefile ch01.c效果1

11、.1.3.6.编译环境变量C_INCLUDE_PATH : 查找头文件的目录。C。CPATH :查找头文件,相当于-l选项。CPLUS_INCLUDE_PATH :查找头文件的目录。C+。LD_LIBRARY_PATH :编译没有影响,主要影响运行。指定目录便于定位共享库。LIBRARY_PATH :查找连接文件,相当于-l选项。1.1.4.生成汇编1.1.4.1.编译成汇编gcc -S ch01.c ch01_1.c注意:汇编编译也要依赖检验的。1.1.4.2.编译汇编gcc ch01.s ch01_1.s -o main1.1.5.创建静态库1.1.5.1.编译静态库gcc -c -sta

12、tic ch01_1.c其中-static可选。1.1.5.2.ar指令ar -r libmy.a ch01_1.o语法:ar 选项 归档文件名 目标文件列表指令ar 的常用选项选项 说明-d 从归档文件删除指定目标文件列表。-q 将指定目标文件快速附加到归档文件末尾。-r 将指定目标文件插入文档,如果存在则更新。-t 显示目标文件列表-x 把归档文件展开为目标文件1.1.5.3.使用静态库gcc -o main ch01.c libmy.a如果libmy.a在LIBRARY_PATH的指定目录中,还可以采用如下方式编译。gcc ch01.c -o main -lmy注意:上面的先后位置错误可

13、能导致编译错误。1.1.6.创建共享库1.1.6.1. 编译共享库编译共享库分成两个部分:1. 编译成位置独立代码的目标文件,选项-fpic2. 编译成共享库,选项-sharedgcc -c -fpic ch01_1.cgcc -shared ch01_1.o -o libmy.so使用一条指令的效果一样gcc -fpic -shared ch01_1.c -o libmy.so1.1.6.2.定位共享库共享库编译的时候与静态库一样依赖LIBRARAY_PATH ,运行的时候依赖 LD_LIBRARY_PATH。下面是配置的LD_LIBRARY_PATH规则:1. 查找LD_LIBRARY_P

14、ATH,目录使用冒号分隔。2. /ect/ld.so.cache中找到的列表。工具ldconfig维护。3. 目录/lib4. 目录/usr/lib1.1.6.3.使用共享库gcc ch01.c libmy.so -o main在代码中动态加载共享库:共享库代码int add(int a,int b)int c=a+b;c=c/2;return c;调用共享库代码#include #include #include int main()/* 动态库 */void *handle;/* 加载中的错误描述 */char *error;/* 调用的函数指针 */int (*myadd)(int,in

15、t);/* 加载共享库 */handle=dlopen(“./libadd.so“,RTLD_LAZY);error=dlerror();if(error)printf(“lib load error:%sn“,error);exit(1);myadd=dlsym(handle,“add“);error=dlerror();if(error)printf(“lib load error:%sn“,error);exit(1);int a=myadd(23,89);printf(“out:%dn“,a);dlclose(handle);return 0;说明:共享库的四个函数SYNOPSIS#i

16、nclude void *dlopen(const char *filename, int flag);char *dlerror(void);void *dlsym(void *handle, const char *symbol);int dlclose(void *handle);其中dlopen的参数flag的含义如下:RTLD_LAZY:符号查找时候才加载。RTLD_NOW:马上加载。1.1.6.4.库工具程序介绍1、 ldconfig生成文件/etc/ld.so.cache2新版本:ldconfig -v 其他选项:选项 说明-n 不产生缓冲文件,列出指定目录下的库-p 显示缓存文

17、件中所有库按字母排序的列表,包括连接库的完整路径-v示例:ldconfig -vldconfig -vn /libldconfig -vnp /lib2、nm列出目标文件中的符号名:nm libmy.a其他常用参数选项 说明-p 不排序显示-r 逆序排列显示-size-sort 大小排列显示-o 用源文件标识成员符号-s 包含模块的索引信息-D 对共享库显示动态符号,而不是静态符号-g 显示定义为外部的符号示例:3、strip去除指定目标文件与静态库中的调试信息 :strip ch01_1.o libmy.a4、ldd列出共享库的依赖关系:ldd libmy.so5、objdump显示目标文件

18、的内部结构:objdump f h EB hello.o1.1.6.5.其他编译选项-I 添加编译器搜索头文件的目录。-L 添加编译器 搜索库文件的目录。-l 指示编译器链接指定的库文件。总结常用编译选项-c 取消链接,生成目标文件-Dmacro 定义指定的宏,在代码中用#idef检测-E 预处理输出到标准输出设备-g3 获得调试的详细信息-I 头文件的搜索目录-L 库文件的搜索目录-l 库文件-O -O2 -O3 编译优化-S 汇编输出-v 启动所有警报-Wall 发生警报时取消编译-w 禁止所有警报1.1.7.C语言扩展1.1.7.1.控制C语言版本版本 说明-ansi 编译标准程序,与G

19、NU兼容-pedantic 严格按照标准,提示警告信息-std=c89 ISO C89标准-std=C99 ISO C99标准-std=gnu89 具有GNU扩展功能的ISO C89标准,某些C99标准-traditional 兼容最原始的C语法检测1.1.7.2.对齐1.1.7.3.数组扩展1.1.7.4.属性1.1.7.5.使用复合语句的返回值1.1.7.6.枚举不完全类型1.1.7.7.函数原型1.1.7.8.整数1.1.7.9.更换关键字1.1.7.10.标识地址1.1.7.11.局部标签1.1.7.12.switch语句1.1.7.13.typedef1.1.7.14.typeof1

20、.1.7.15.联合类型强制转换1.2.编译C+程序(基本上同C一样)1.2.1.编译执行文件1.2.1.1.C+后缀名1.2.1.2.编译单源程序1.2.1.3.编译多源程序1.2.2.编译目标文件1.2.2.1.编译成目标文件1.2.2.2.使用目标文件编译1.2.3.预处理1.2.3.1.预处理编译1.2.3.2.使用预处理文件编译1.2.4.生成汇编1.2.4.1.编译成汇编文件1.2.4.2.使用汇编文件编译1.2.5.创建静态库1.2.5.1.编译静态库1.2.5.2.使用ar 打包静态库1.2.5.3.使用静态库1.2.6.创建共享库1.2.6.1.编译动态库1.2.6.2.使用

21、动态库1.2.7.C+语言的扩展1.2.7.1.头文件引入1.2.7.2.函数名1.2.7.3.接口与实现2.GDB的使用2.1.GDB基础2.1.1.生成调试信息在编译程序的时候使用-g选项生成调试信息。2.1.2.启动调试语法: gdb 也可以直接启动gdb其他启动方式gdb gdb core 用gdb同时调试一个运行程序和core文件.core是程序非法执行后core dump产生的文件.gdb 指定进程号gdb的常用启动开关.-symbols -s 从指定文件读取符号表.-se 从指定文件读取符号表,并用在可执行文件中.-core -c 调试的时候core dump的core文件-di

22、rectory -d 加入源文件的搜索路径.默认搜索路径是PATH2.1.3.调试模式设置调试模式两种:批模式与安静模式安静模式:gdb -quiet 或者 gdb q。若不想看见logo请加 -q 或-quiet参数。批模式 :gdb gdb -batch 一般做为过滤器运行使用。示例:2.1.4.退出调试在gbd 下使用quit与q 退出2.1.5. 查看帮助在gdb提示符号下:输入info查看所有帮助。技巧提示:info 首字母 可以获取快速输入。快速帮助2.2.使用GDB控制调试过程2.2.1.环境变量设置path 目录 :添加一个新的PATH环境变量show paths :显示PAT

23、H环境变量show environment 环境变量名 :显示某个环境变量set environment 环境变量名=值 :设置某个环境变量的值set env环境变量名=值unset environment 环境变量 :删除环境变量unset env 环境变量cd 目录 :改变目录pwd2.2.2.运行程序run :执行程序file 执行文件名 :指定调试程序2.2.3.调试一个已经运行的程序attach 进程ID2.2.4.显示附加的信息info proc all : 显示所有进程信息2.2.5.查看代码listm,n m,n指开始与结束行号!2.2.6.设置断点(break b)break

24、 行号 break 文件名:行号 if 条件 break +n :当前行数后n行break 函数名 break 文件名:函数名 if 条件 break -n2.2.7.检查数据(print p)print 变量名print $1 打印历史记录。print 数组名n 打印从数组地址开始的n格内存区域。print /格式 变量x-16进制d-10进制u-无符号整数o-8进制t-二进制a-地址格式c-字符f-小数2.2.8.检查数据类型(whatis)whatis 变量名ptype 结构名 /得到结构定义。2.2.9.删除断点clear 函数clear 文件名:函数clear 行数clear 文件名

25、:行数2.2.10.显示断点信息。info breakpoints2.2.11.改变变量的值(set variable )。set variable 变量名=值。2.2.12.断点操作start 开始逐行调试。next 下一个,不进入函数n。step 下一个,进入函数sfinish 完成回到上一个程序环境continue 继续cuntil 执行到最后循环u2.2.13.关闭启动断点Enable 断点行数disableenabled deletedisable once2.2.14.观察点watch 表达式 :当值发生改变的时候,程序停止。info watchpoints :显示观察点2.2.1

26、5.调用shell指令shell 命令2.2.16.查看内存x /fmt 地址2.2.17.设置命令行参数set args 参数1 参数2 2.2.18.显示命令行参数show args2.2.19.各种信息查看info locals 所有局部变量info argsinfo frame 2.2.20.终止正在调试的程序kill 终止正在调试的程序. 2.2.21.设置自动变量display 变量display /i $pc : 显示指令地址,$pc是一个特殊的环境变量,表示指令存放地址。/i表示输出格式是及其码。2.2.22.删除自动显示变量与表达式del display2.2.23. 查看汇编disassemble :当前过程汇编disassemble 函数名 :指定过程汇编disassemble 地址1 地址 2 :指定地址范围内的汇编

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报