您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > 06.Linux下编程工具(gcc、gdb)
嵌入式系统工程师Linux下编程工具(概述、目录结构)大纲linux环境开发概述linux文件及目录结构linux常用命令linux文本编辑器vi+geditlinuxshell脚本编程linux编译器gcc、gdblinux工程管理软件—make大纲linux环境开发概述linux文件及目录结构linux常用命令linux文本编辑器vi+geditlinuxshell脚本编程linux编译器gcc、gdblinux工程管理软件—make5linux环境开发概述windows开发方式特点:在电脑上装一个vc或其它集成开发环境编辑程序—编译程序—看现象—有问题—修改程序-调试程序-查看linux开发特点:linux下的程序开发大多通过在本地安装虚拟机、物理机或网络连接到服务器完成出于效率、远程开发、嵌入式开发的考虑:开发方式大多是在命令行下完成,没有很好的集成开发环境供我们使用6linux环境开发概述Linux文件及目录结构无论何种版本的linux,桌面、应用是linux的外衣文件组织、目录结构才是linux的内心Linux命令无命令,不Linux编辑器、编译器、调试器写程序永远离不开:编辑、编译、调试不同windows下完善集成开发环境,linux下以上操作大多在字符界面通过各种各样命令完成,品尝自己原始加工的乐趣shell脚本+makefileshell脚本处理linux中复杂而又繁琐的操作makefile管理复杂的代码关系7大纲linux环境开发概述linux文件及目录结构linux常用命令linux文本编辑器vi+geditlinuxshell脚本编程linux编译器gcc、gdblinux工程管理软件—make8大纲GCC概述gcc命令gdb动态库与静态库9大纲GCC概述gcc命令gdb动态库与静态库10GCC概述编译器是将易于编写、阅读和维护的高级计算机语言翻译为计算机能解读、运行的低级机器语言的程序。GUN项目中的一个子项目GCC(GNUCompilerCollection)是一个编译器套装,是GNU计划的关键部分,也是GUN最优秀的软件之一。GCC最初用于编译C语言,随着项目的发展GCC已经成为了能够编译C、C++、Java、Ada、fortran、ObjectC、ObjectC++、Go语言的编译器大家族。11GCC概述GCC的组成GCC由cpp(预处理器)、gcc(C编译器)、g++(C++编译器)、binutils(BinaryUtilities二进制工具)等工具组成。binutils是辅助GCC的主要软件,常用的工具有:as(汇编器)、ld(链接器)、ar(ar工具)等等。12大纲GCC概述gcc命令gdb动态库与静态库13gccgcc仅仅作为真实的编译器和链接器的入口。它会在需要的时候调用其它组件(预处理器、汇编器、连接器),并且会传一些额外的参数给编译器和连接器。输入文件的类型和传给gcc的参数决定了gcc调用哪些组件。14gccgcc识别的文件扩展名如下:.cC语言文件.i预处理后的C语言文件.C、.cc、.cp、.cpp、.c++、.cxxC++语言文件.ii预处理后的C++语言文件.S汇编文件.s预处理后的汇编文件.o编译后的目标文件.a目标文件的静态链接库(链接时使用).so目标文件的动态链接库(链接、运行时使用)15gcc编译命令格式gcc[-option1]...filenameg++[-option1]...filename1.命令、选项和源文件之间使用空格分隔2.一行命令中可以有零个、一个或多个选项3.文件名可以包含文件的绝对路径,也可以使用相对路径。4.如果命令中不包含输出可执行文件的文件名,可执行文件的文件名默认为a.out。16gccgcc、g++编译选项-ofile指定生成的输出文件名为file-E只进行预处理-S只进行预处理和编译-c只进行预处理、编译和汇编-Wall生成所有级别的警告信息-w关闭所有警告,建议不使用此选项17gcc-O[0-3]编译器优化级别数值越大级别越高,0表示不优化-includefile插入一个文件等同于源代码中的#include-Dmacro[=def]将名为marco的宏定义为def等同于#definemacro[def]若[def]忽略不写,则macro等于1-Umacro取消宏的定义等同于源代码中的#undefmacro-v显示制作GCC工具时的配置命令显示预处理器、编译器的版本号18gcc-Idir将dir目录加入头文件搜索目录列表优先在dir目录中查找包含的头文件-Ldir将dir目录加入库文件目录列表优先在dir目录中查找库文件-lname链接库为name的库-static链接时使用静态库-shared编译动态库-g在可执行文件中加入标准调试信息19gccgcc、g++的编译过程gcc和g++编译器的编译过程:1、预处理2、编译3、汇编4、链接编译过程示意图:gcc步骤.bmp20gccgcc常用编译应用实例:例1:gcc-Ehello.c-ohello.igcc-Shello.i-ohello.sgcc-chello.s-ohello.ogcchello.o-ohello_elf例2:gcchello.c-ohello_elf21大纲GCC概述gcc命令gdb动态库与静态库22gdb简介GNU工具集中的调试器是gdb,该程序是一个交互式工具,工作在字符模式。除gdb外,linux下比较有名的调试器还有xxgdb,ddd,kgdb,ups。23gdb的使用gdb是功能强大的调试器,可完成如下调试任务:1、设置断点2、监视程序变量的值3、程序的单步执行4、显示/修改变量的值5、显示/修改寄存器6、查看程序的堆栈情况7、远程调试24gdb的使用下面以一个小程序来说明gdb的使用流程25gdb的使用26gdb的使用27gdb的使用28大纲GCC概述gcc命令gdb动态库与静态库链接方式静态库共享库29链接方式链接分为两种:静态链接、动态链接静态链接:由链接器在链接时将库的内容加入到可执行程序中静态链接的特点是:优点:对运行环境的依赖性较小,具有较好的兼容性缺点:生成的程序比较大,需要更多的系统资源,在装入内存时会消耗更多的时间库函数有了更新,必须重新编译应用程序静态库与动态库30动态链接:连接器在链接时仅仅建立与所需库函数的之间的链接关系,在程序运行时才将所需资源调入可执行程序动态链接的特点:优点:在需要的时候才会调入对应的资源函数简化程序的升级;有着较小的程序体积实现进程之间的资源共享(避免重复拷贝)缺点:依赖动态库,不能独立运行动态库依赖版本问题严重静态库与动态库31前面我们编写的应用程序大量用到了标准库函数使用gcchello.c–ohello时,系统默认采用动态链接的方式进行编译程序,若想采用静态编译,加入-static参数以下是分别采用动态编译、静态编译时文件对比:gcchello.c–ohello_sharegcchello.c–static–ohello_static静态库与动态库32动态链接库与静态链接库的制作与使用下面我们以把自己编写的函数分别制作为动态库与静态库为例讲解如何制作、使用两种库函数静态库与动态库mylib.c:mylib.hmytest.c33制作静态链接库:静态链接库在linux中后缀为.a,以lib开头,如:libtestlib.a1.制作:#gcc-cmylib.c-omylib.o//编译目标文件#arrclibtestlib.amylib.o//制作静态库2.使用:1)库函数、头文件均在当前目录下#gcc-omy_testmytest.clibtestlib.a2)库函数、头文件假设在/opt目录#gcc-omytestmytest.c-L/opt-ltestlib-I/opt静态库与动态库343)编译程序时编译程序时,编译器默认会到/lib/、/usr/lib下查找库函数,到/usr/include下查找头文件将libmylib.a移到/lib或/usr/lib下#mvlibtestlib.a/lib将mylib.h移到/usr/include下#mvmylib.h/usr/include编译:#gccmytest.c-omytest-ltestlib//编译器会自动到/lib下查找库文件,到/usr/include下查找头文件静态库与动态库35制作动态链接库:#gcc-sharedmylib.c-olibtestlib.so//使用gcc编译、制作动态链接库动态链接库的使用1:1)库函数、头文件均在当前目录下#gcc-omy_testmytest.clibtestlib.so2)库函数、头文件假设在/opt目录#gcc-omytestmytest.c-L/opt-ltestlib-I/opt编译通过,运行时出错,编译时找到了库函数,但链接时找不到库,执行以下操作,把当前目录加入搜索路径#exportLD_LIBRARY_PATH=./:/opt:$LD_LIBRARY_PATH#./mytest可找到动态链接库静态库与动态库36动态链接库的使用2:1.库函数、头文件均在系统路径下#cplibtestlib.so/lib#gccmytest.c-omytest-ltestlib#./mytest编译运行都不会出错静态库与动态库37问题:有个问题出现了?我们前面的静态库也是放在/lib下,那么连接的到底是动态库还是静态库呢?当静态库与动态库重名时,系统会优先连接动态库,或者我们可以加入-static指定使用静态库静态库与动态库
本文标题:06.Linux下编程工具(gcc、gdb)
链接地址:https://www.777doc.com/doc-5935182 .html