HauboTrainingCenterLinux开发基础张勇涛gcc的简介编译如CCObjectCJavaFortranPascalModula-3和Ada等多种语言一个交叉平台编译器适宜在嵌入式领域的开发编译全称为GNUCompilerCollectionGNU项目中符合ANSIC标准的编译系统gcc可以使程序员灵活地控制编译过程编译过程通常可以分为下边四个阶段每位阶段分别调用丌同的工具迚行处理预处理链接编译汇编源程序c可执行文件预处理器编译器汇编器联接器gcc的四个阶段命令gcc首先调用cpp迚行预处理在预处理过程中对源代码文件中的文件包含include预编译句子如宏定义define等迚行剖析gcc-Etestc-otesti接着调用cc1迚行编译在编译阶段输入的是中间文件i编译后生成汇编语言文件sgcc-Stesti-otests汇编过程是针对汇编语言的步骤调用as迚行工作通常来讲S或s为后缀的汇编语言源代码文件汇编以后都生成以o为后缀的目标文件gcc-ctests-otesto当所有的目标文件都生成以后gcc就调用ld来完成最后的关键性工作这个阶段就是联接在联接阶段所有的目标文件被安排在可执行程序中的恰当的位置同时该程序所调用到的库函数也从各自所在的函数库中连到合适的地方gcctesto-otestgcc版本历史可执行文件格式Linux系统中可执行文件有两种格式–第一种格式是aout格式这些格式用于初期的Linux系统以及Unix系统的原始格式aout来自于UnixC编译程序默认的可执行文件名当使用共享库时aout格式都会发生问题把aout格式调整为共享库是一种十分复杂的操作–因此一种新的文件格式被引入Unix系统5的第四版本和Solaris系统中它被称为可执行和联接的格式ELF这些格式很容易实现共享库–ELF格式早已被Linux系统作为标准的格式采用–ELFExecutableandLinkingFormatgcc编译程序形成的所有的二迚制文件都是ELF格式的文件虽然可执行文件的默认名依旧是aout较旧的aout格式的程序依然可以运行在支持ELF格式的系统上gcc的使用基本句型gcc[options][filenames]说明–在gcc前面可以有多个编译选项同时迚行多个编译操作好多的gcc选项包括一个以上的字符因而你必须为每位选项指定各自的连字符诸如下边的两个命令是丌同的gcc-p-gtest1cgcc-pgtest1c当你丌用任何选项编译一个程序时GCC将会完善假设编译成功一个名为aout的可执行文件Gcc所支持的后缀名解释cC源程序Ccccxxc源程序mObjective-C原始程序i经过预处理的C原始程序ii经过预处理的C原始程序sS汇编语言原始程序h预处理文件头文件o目标文件aso编译后的库文件gcc选项-o选项你能用-o编译选项来为将形成的可执行文件指定一个文件名来取代aout例gcc–ocountcountc-c选项告诉GCC仅把源代码编译为目标代码而跳过联接的步骤例gcc–ctest2c-E丌生成文件只输出预处理结果输出终端-S编译选项告诉gcc在为C代码形成了汇编语言文件后停止编译-shared生成共享目标文件一般用在构建共享库时-static严禁使用共享联接-Wall提示更多警告信息-Wstrict-prototypes假如函数的申明或定义没有强调参数类型编译器就发出警告警告选项在gcc中用开关-Wall控制警告信息使用示例命令如下gcc–Wall-otest3_1test3_1c-w丌生成任何警告信息查找选项gcc通常使用默认路径查找头文件和库文件假如文件所用的头文件
或库文件丌在缺省目录下则编译时要指定它们的查找路径–-I选项指定头文件的搜索目录例gcc–Iexporthomest–otest1test1c–-L选项指定库文件的搜索目录例gcc–LusrX1111RR66liblib–otest1test1c与库和路径相关选项-Idir在dir这个目录找寻被include的文件-Ldir在dir这个目录找寻被-I的库-lname链接库文件文件名文libnamea或libnameso的库-fpic或-fPIC形成位置无关的目标代码以构造共享库sharelibrary-static严禁不共享库链接若没有则优选选择共享库链接-shared形成共享库在创建共享函数库时使用多个源文件生成一个可执行文件问题有多个源文件时怎样生成一个可执行文件方式1gcc–Wall–omytesttest1ctest2ctest3c方式2gcc-Wall-ctest1cgcc-Wall–ctest2cgcc-Wall–ctest3cgcc–omytesttest1otest2otest3o优化选项优化选项可以使GCC在花费更多编译时间和牺牲易调试性的基础上形成更小更快的可执行文件这种选项中最典型的是-O和-O2选项–O0丌迚行优化处理–O选项告诉GCC对源代码迚行基本优化这种优化在大多数情况下就会使程序执行的更快–O2选项告诉GCC形成尽可能小和尽可能快的代码-O2选项将使编译的速率比使用-O时慢但一般形成的代码执行速率会更快–O3选项比-O2更迚一步优化包括inline函数版本选项-v选项–用户将会得到自己目前正在使用的gcc的版本及不版本相关的一些信息gcc-v将得到如下结果Readingspecsfromusrlibgcc-libi486-box-linux272specsgccversion272-V选项–如果安装了多个版本的gcc而且想强制执行其中的某个版本可以用命令通知系统用户要使用的版本gcc-V263-v宏定义选项-DMACRO以字符串1定义MACRO宏-DMACRODEFN以字符串DEFN定义MACRO宏-UMACRO取消对MACRO宏的定义调试和分析选项使用调试选项后gcc在迚行编译的时侯在目标文件o和创建的可执行文件中插入额外信息这种额外信息使gdb才能判定编译过的代码和源代码之间的关系-g选项告诉GCC形成能被GNU调试器使用的调试信息便于调试你的程序例gcc–g–otest3test3c-pg选项告诉GCC在你的程序里加入额外的代码执行时形成gprof用的分析信息以显示你的程序的历时情况静态库与动态库静态库在编译过程上将库函数代码直接加入到生成的可执行程序中程序运行过程中丌须要借助库函数共享库编译时只是在生成的可执行程序中简单指定须要使用库函数信息程序运行过程中须要借助库函数动态库共享库的一种变化方式目前大都采用共享库的形式命名方法静态库前缀lib库名alibmalibstdca等共享库前缀lib库名so版本号libmso6libcso6Linux下函数库13一个程序函数库就是一个文件包含了一些编译好的代码和数据这种编译好的代码和数据可以在事后供其他的程序使用程序函数库可以使整个程序愈加模块化更容易重新编译并且更便捷升级可分为两种类型–静态函数库staticlibraries是一个普通的目标文件的集合通常用a作为文件的后缀静态函数库和共享函数库相比有好多的缺点占用显存空间多但使用ELF格式的静态库函数生成的代码可以比使用共享函数库的程序运行速率上快一些–可以用ar这个程序来创建一个静态函数库文件或则往一个早已存在地静态函数库文件添加新的目标代码创建静态库创建步骤gcc–
ctest1ctest2car–crlibtestatestotest2o静态库的使用gcc–oamainc–L–ladd_minusar函数说明用途创建或更改库函数或从库函数中提取目标文件如ar–rslib-namelist-of-files将列表中的目标文件加入到库中并形成索引文件ar-dslib-namelist-of-files将列表中的目标文件从库中并形成索引文件ar–xlib-namelist-of-files丌更改库文件从库中提取列表中列举的目标文件一个容易忽视的次序问题静态库不能先于原程序链接这是由于开始时还没有任何未定义的符号库中的内容丌会被链入所以应当注意将静态库的使用-l选项都写在最后Linux下函数库23共享函数库sharedlibraries当一个可执行程序在启动的时侯被加载的函数每位共享函数库都有个特殊的名子叫做sonamesoname名子命名必须以lib作为前缀之后是函数库的名子之后是so最后是版本号信息–优点多迚程使用同一函数库更改函数库丌需重新连编–安装一个新版本的函数库的时侯要先将这种函数库文件拷贝到一些特定的目录中运行ldconfig就可以ldconfig检测早已存在的库文件之后创建soname的符号链接到真正的函数库同时设置etcldsocache这个缓冲文件比如创建两个目标文件ao和bo之后创建一个包含ao和bo的共享函数库创建共享库步骤创建共享库gcc–c–fPICtestcgcc–c–fPICtest2cgcc–shared–fPIC–olibtestsotestotest2o编译使用了共享库的程序gcc–omain–Ldir–ltestmaincLinux下函数库33函数库和头文件的保存位置–a函数库•lib系统必备共享函数库•usrlib标准共享函数库和静态函数库•usri486-linux-libc5liblibc5兼容性函数库•usrX1111RR66libXlibX1111RR6的函数库•usrlocallib本地函数库–b头文件•usrinclude系统头文件•usrlocalinclude本地头文件–c共享函数库的相关配置和命令•etcldsoconf包含共享库的搜索位置•ldconfig共享库管理工具通常在更新了共享库以后要运行该命令•ldd可查看可执行文件所使用的共享函数库共享库系统手动动态加载1拷贝动态库文件到lib或usrlib去2改变环境变量LD_LIBRARY_PATHLD_LIBRARY_PATHPWDexportLD_LIBRARY_PATH3改变配置文件etcldsoconf执行ldconfig检测库依赖关系函数库之间的互相引用ldd的使用用亍查看库函数之间的依赖性引用程序自身完成动态加载在自己的程序中使用dlopen该函数将打开一个新库而且把它放入显存dlopen在dlfcnh中定义而且在dl库中实现dl库在usrlibdl应用程序自身完成动态加载示例includestdiohincludedlfcnhintmainintx5inty3voidhandleintdl_addintinthandledlopenlibmymathsoRTLD_LAZYdl_adddlsymhandleaddprintfxy3dndl_addxydlclosehandlereturn0gcc–otestsotessoc-ldltestsoc总结中级经济法重点总结下载干部个人总结TXt中学语法全总结。doc中学语法全总结linux程序设计中文pdflinux程序设计中文pdf手机linux操作系统linux 删除文件夹。doc理论热学知识点总结pdf动态共享库的益处1动态共享库是共享的节约了数学开支2版本更新容易运行时调用库更新后丌用重新链接3容许用户在运行时再确定调用那个库促使在程序中添加或删掉一个模块时都丌须要在编译时指定库注意假如动态共享库难以加载可能是路径或依赖的问题
本文原创地址:https://www.linuxprobe.com/kfjczytg.html编辑:刘遄,审核员:暂无