Unix编译工具.doc
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《Unix编译工具.doc》由用户(无敌的果实)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Unix 编译 工具
- 资源描述:
-
1、Unix环境与编译工具讲稿Version 1.0Unix Programming Environment & Tools引用自 LouisYoung 杨强老师 修订历史摘要日期修改原因版本文档创建2009-4-18新建1.0目录1.GCC的使用51.1.编译C程序51.1.1.编译执行文件51.1.1.1.C程序中的文件后缀名51.1.1.2.编译单源程序61.1.1.3.编译多源程序71.1.2.编译目标文件81.1.2.1.编译成目标文件81.1.2.2.使用目标文件编译81.1.3.预处理81.1.3.1.预处理编译81.1.3.2.编译预处理文件81.1.3.3.预处理指令介绍91.1
2、.3.4.预定义宏介绍131.1.3.5.预处理与make选项141.1.3.6.编译环境变量141.1.4.生成汇编141.1.4.1.编译成汇编141.1.4.2.编译汇编141.1.5.创建静态库151.1.5.1.编译静态库151.1.5.2.ar指令151.1.5.3.使用静态库151.1.6.创建共享库161.1.6.1. 编译共享库161.1.6.2.定位共享库161.1.6.3.使用共享库171.1.6.4.库工具程序介绍181.1.6.5.其他编译选项221.1.7.C语言扩展221.1.7.1.控制C语言版本221.2.编译C+程序(基本上同C一样)232.GDB的使用24
3、2.1.GDB基础242.1.1.生成调试信息242.1.2.启动调试242.1.3.调试模式设置252.1.4.退出调试252.1.5.查看帮助252.2.使用GDB控制调试过程261. GCC的使用1.1.编译C程序1.1.1.编译执行文件Linux下最常用的编译器是gcc.(GNU Compiler Collection) 她通过不同的前端模块来支持对各种不同语言的。编译,如C、C+、Object C、Java、Fortran、Pascal、Ada等语言。GCC是可以在多种硬件平台上编译出可执行。程序的超级编译器.其执行效率与一般的编译器相比,平均效率要高20%-30%.在使用GCC编译
4、程序时,编译过程可以细分为4个阶段:a.预处理。b.编译。c.汇编。d.链接。程序员可以对编译过程进行控制,同时GCC提供了强大的代码优化功能。查看gcc的版本:gcc v1.1.1.1.C程序中的文件后缀名扩展名说明.a静态对象库.c需要预处理的C语言源代码.hC语言源代码头文件.i不需要预处理的C语言源代码.o目标文件.s汇编语言代码.so共享对象库1.1.1.2.编译单源程序语法:gcc 选项参数 c文件 例子:gcc ch01.c 通用选项参数说明如下:1、指定输出文件名-o 指定输出文件名例子:gcc -o main ch01.c 2、警告与提示.-pedantic检测不符合ANSI
5、/ISO C语言标准的源代码,使用扩展语法的地方将产生警告信息。-Wall生成尽可能多的警告信息。-Werror要求编译器将警告当做错误进行处理。 例子:gcc Wall o main ch01.c 3、指定编译文件类型-x指定编译代码类型,c、c+、assembler,none。None根据扩展名自动确认。例子:gcc x c -Wall o main ch01.c4、生成调试信息与优化-g 生成调试信息-O优化-O1、O2、O3 优化等级5、建议:在编译任何程序的时候都带上-Wall选项。6、-g与-O一般不会同时出现示例:#!/bin/bash#GCC使用echo 编译.gcc -x c
6、 -o main -Wall ch01.cecho 执行./main调试与优化:1.1.1.3.编译多源程序1、语法:gcc 选项 C源代码1 C源代码2 C源代码32、示例:代码 ch01.c#include /* 演示编译器gcc */int add(int ,int);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注意:在调用处,最好加上显示a
7、dd函数声明,否则会报一个警告(去掉-Wall不会警告)。Add函数的声明可以单独存放一个文件,就是头文件。思考:头文件的作用是什么?1.1.2.编译目标文件1.1.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方式二:编译一个目标文件gc
8、c -o main main.o1.1.3.预处理1.1.3.1.预处理编译语法:gcc -E C源代码文件示例:gcc -E -o ch01.i ch01.c gcc -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定义宏#undef删除宏#erro
9、r产生错误,挂起预处理程序#warning创建一个警告#if判定#endif结束判定#elifelse if 多选分支#else与#if、#ifndef、#ifdef结合使用#ifdef判定宏是否定义#ifndef判定宏是否定义#include将指定的文件插入#include的位置#include_next与#include一样,但从当前目录之后的目录查找#line指定行号#pragma提供额外信息的标准方法,可用来指定平台#连接操作符号,用于宏内连接两个字符串示例:1、#define 、#undef#include /* 演示编译器gcc */#define YQ#define LOUIS
10、ENGLISH NAME int main() printf(“%sn,YQ”); /*编译出错,使用gcc E 查看预处理结果*/printf(%sn,LOUIS);/*#undef LOUIS*/printf(%sn,LOUIS); /*编译出错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/*
11、演示编译器gcc */#if (VERSION 2)#error 版本低#else#warning 版本高#endifint main()printf(Hello gcc使用!n); return 0;4、#ifdef、#else、#endif(函数,可以两次声明,但不可以两次定义)#include #define DEBUG/* 演示编译器gcc */#ifdef DEBUG#warning 调试#else#warning 非调试#endif/这个指示符号的使用还是比较广泛的int main()printf(Hello gcc使用!n); return 0;使用#ifdef、#define可
12、以防止头文件二次引入。5、#include、#include_next 详见1.1.3.7说明: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 会在所有标准目录的子目录sys中查找time.h6.#include的文件名不不含扩展,*、?无意义。除
13、非文件名中包含*。6.#line#include int main()int re=0;printf(Hello gcc使用!n); for(int i=0;i200)re+=i;printf(out:%dn,re);/代码行数被修改#line 200/另外得用法/#line 200 ch01_c.cprintf(out:%dn,re,a);/人为错误printf(out:%dn,re);return 0;7、#pragma所有GCC的pragma都定义两个词GCC +其他1.#pragma GCC dependency 文件名 提示内容测试文件的时间戳,当指定文件比当前文件新的时候产生警告。
14、#include #pragma GCC dependency ch02.cint main()int re=0;printf(Hello gcc使用!n); int i;for(i=0;i200;i+)re+=i;printf(out:%dn,re);return 0;2.#pragma GCC poison每次使用指定名字就会产生错误。#include #pragma GCC dependency ch02.c#pragma GCC poison printf addint main()int re=0;printf(Hello gcc使用!n); int i;for(i=0;i200;i
15、+)re+=i;printf(out:%dn,re);return 0;3.#pragma GCC system_header -一般很少使用,还没有发现有什么功能 1.该指示符后的代码都做为系统头文件的一部分。 2.系统头文件往往不能完全遵循c标准,所以头文件中的警告信息 大多数都不显示(除非用#warning显示声明) 3.该指令 定义在c文件中无效,只能定义在 头文件中提示:#pragma有一个等价的宏_Pragam #include #pragma GCC dependency ch02.c/#pragma GCC poison printf addint main()int re=0
16、;printf(Hello gcc使用!n); int i;_Pragma(GCC poison printf add)for(i=0;i200;i+)re+=i;printf(out:%dn,re);return 0;8.1、# 运算符用于创建字符串 格式:#形参(中间可以有空格或者Tab),因为#后面必须跟形参,所以#运算符仅限于 函数式宏定义#include #define STR(a) #aint main()int re=0;printf(Hello gcc使用:%s!n,STR(99); return 0;/输出结果为:998.2、# 运算符用于连接前后的数据, 格式: data1
17、#data2(可以有空格或者Tab),注意:1. 结果:连起来是什么就是什么类型的结果如:99#20 结果是:9920 int类型“ab#cd”连起来是”abcd” string类型2. Data1与data2既可以是形参,也可以不是形参,所以 #既适用于 函数式宏定义,也适用于变量式宏定义#include #pragma GCC dependency ch02.c/#pragma GCC poison printf add#define HELLO(a) a#200int main()int re=0;printf(Hello gcc使用:%s!n,HELLO(99); return 0;1
18、.1.3.4.预定义宏介绍预定义的宏很多,下面列出常用的。宏说明_BASE_FILE_源代码的完整路径_cplusplusC+有效,程序不符合标准为1,否则是标准的年月_DATE_日期_FILE_源代码文件名_func_当前函数名_FUNCTION_同上_INCLUDE_LEVEL_包含层数,基本的为0_LINE_行数_TIME_时间示例:#include int main()printf(Hello gcc使用:%d!n,_LINE_); printf(Hello gcc使用:%s!n,_DATE_); printf(Hello gcc使用:%s!n,_BASE_FILE_);return
19、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.1.3.6.编译环境变量C_INCLUDE_PATH: 查找头文件的目录。C。CPLUS_INCLUDE_PATH:查找头文件的目录。C+。OBJC
20、_INCLUDE_PATH: 查找头文件的目录。OBJECTCCPATH:查找头文件,相当于-l选项。LD_LIBRARY_PATH:编译没有影响,主要影响运行。指定目录便于定位共享库。LIBRARY_PATH:查找连接文件,相当于-l选项。1.1.3.7.预处理指令#include与#include _next介绍#include与#include_next用于指定系统头文件,下面分别来详细介绍#include #include 代表系统头#include ”userhead.h” 代表用户头文件 I选项,可以用于添加系统头文件的搜索目录(1或n个),而且优先级最高 gcc查找系统头文件的顺
展开阅读全文