Linux程序设计基础—gcc使用2020/9/20gcc的简介编译如C、C++、ObjectC、Java、Fortran、Pascal、Modula-3和Ada等多种语言一个交叉平台编译器,适合在嵌入式领域的开发编译全称为GNUCompilerCollection,GNU项目中符合ANSIC标准的编译系统gcc可以使程序员灵活地控制编译过程。编译过程一般可以分为下面四个阶段,每个阶段分别调用不同的工具进行处理预处理链接编译汇编源程序(*.c)可执行文件预处理器编译器汇编器连接器2020/9/20gcc的四个阶段命令gcc首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。接着调用cc1进行编译,这个阶段根据输入文件生成以.o为后缀的目标文件。汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,.S或.s为后缀的汇编语言源代码文件汇编之后都生成以.o为后缀的目标文件。当所有的目标文件都生成之后,gcc就调用ld来完成最后的关键性工作,这个阶段就是连接。在连接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,同时,该程序所调用到的库函数也从各自所在的函数库中连到合适的地方。2020/9/20gcc版本历史2020/9/20可执行文件格式Linux系统中可执行文件有两种格式。–第一种格式是a.out格式,这种格式用于早期的Linux系统以及Unix系统的原始格式。a.out来自于UnixC编译程序默认的可执行文件名。当使用共享库时,a.out格式就会发生问题。把a.out格式调整为共享库是一种非常复杂的操作。–因此,一种新的文件格式被引入Unix系统5的第四版本和Solaris系统中。它被称为可执行和连接的格式(ELF)。这种格式很容易实现共享库。–ELF格式已经被Linux系统作为标准的格式采用。–ELF(ExecutableandLinkingFormat)gcc编译程序产生的所有的二进制文件都是ELF格式的文件(即使可执行文件的默认名仍然是a.out)。较旧的a.out格式的程序仍然可以运行在支持ELF格式的系统上。2020/9/20gcc的使用基本语法gcc[options][filenames]说明:–在gcc后面可以有多个编译选项,同时进行多个编译操作。很多的gcc选项包括一个以上的字符。因此你必须为每个选项指定各自的连字符。例如,下面的两个命令是不同的:gcc-p-gtest1.cgcc-pgtest1.c当你不用任何选项编译一个程序时,GCC将会建立(假定编译成功)一个名为a.out的可执行文件。2020/9/20Gcc所支持的后缀名解释.cC源程序.C/.cc/.cxxc++源程序.mObjective-C原始程序.i经过预处理的C原始程序.ii经过预处理的C++原始程序.s/.S汇编语言原始程序.h预处理文件(头文件).o目标文件.a/.so编译后的库文件2020/9/20gcc选项-o选项你能用-o编译选项来为将产生的可执行文件指定一个文件名来代替a.out。例:gcc–ocountcount.c-c选项:告诉GCC仅把源代码编译为目标代码而跳过汇编和连接的步骤。例:gcc–ctest2.c-E不生成文件,只输出预处理结果(输出终端)。-S编译选项告诉gcc在为C代码产生了汇编语言文件后停止编译。-g产生调试工具gdb所必要的符号信息,要想对编译出的程序调试,就必须加入这个选项。-Wall提示更多警告信息2020/9/20警告选项在gcc中用开关-Wall控制警告信息,使用示例命令如下:gcc–Wall-otest3_1test3_1.c-w不生成任何警告信息。2020/9/20查找选项gcc一般使用默认路径查找头文件和库文件。如果文件所用的头文件或库文件不在缺省目录下,则编译时要指定它们的查找路径。–-I选项:指定头文件的搜索目录例:gcc–I/export/home/st–otest1test1.c–-L选项:指定库文件的搜索目录例:gcc–L/usr/X11/R6/lib–otest1test1.c2020/9/20与库和路径相关选项-Idir在dir这个目录寻找被include的文件-Ldir在dir这个目录寻找被-I的库-lname链接库文件文件名为libname.a或libname.so的库-fpic或-fPIC产生位置无关的目标代码,以构造共享库(sharelibrary)-static禁止与共享库链接,若没有,则优选选择共享库链接-shared产生共享库,在创建共享函数库时使用2020/9/20多个源文件生成一个可执行文件问题:有多个源文件时,如何生成一个可执行文件?方法1:gcc–omytesttest1.ctest2.ctest3.c方法2:gcc-ctest1.cgcc–ctest2.cgcc–ctest3.cgcc–omytesttest1.otest2.otest3.o2020/9/20优化选项优化选项可以使GCC在耗费更多编译时间和牺牲易调试性的基础上产生更小更快的可执行文件。这些选项中最典型的是-O和-O2选项。–-O0不进行优化处理。–-O选项:告诉GCC对源代码进行基本优化。源代码会在编译,连接过程中进行优化处理。–-O2选项:告诉GCC产生尽可能小和尽可能快的代码。-O2选项将使编译的速度比使用-O时慢。但通常产生的代码执行速度会更快。–-O3选项:比-O2更进一步优化,包括inline函数。2020/9/20版本选项-v选项–用户将会得到自己目前正在使用的gcc的版本及与版本相关的一些信息。gcc-v将得到如下结果:Readingspecsfrom/usr/lib/gcc-lib/i486-box-linux/2.7.2/specsgccversion2.7.2-V选项–如果安装了多个版本的gcc,并且想强制执行其中的某个版本,可以用命令通知系统用户要使用的版本。gcc-V2.6.3-v2020/9/20静态库与动态库静态库:在编译过程中将库函数代码直接加入到生成的可执行程序中,程序运行过程中不需要利用库函数共享库:编译时,只是在生成的可执行程序中简单指定需要使用库函数信息,程序运行过程中需要利用库函数动态库:共享库的一种变化形式,目前大都采用共享库的方式命名方式:静态库:前缀lib+库名+.a(libm.a,libstdc++.a等)共享库:前缀lib+库名+.so+版本号(libm.so.6,libc.so.6)2020/9/20总结:动态共享库的好处1.动态共享库是共享的,节省了物理开销2.版本更新容易,运行时调用,库更新后不用重新链接3.允许用户在运行时再确定调用哪个库.注意:如果动态共享库无法加载,可能是路径或依赖的问题LOGO