收藏 分享(赏)

Linux开发环境介绍--g++autoconfautomakePPT课件.pptx

上传人:Facebook 文档编号:3815881 上传时间:2018-11-19 格式:PPTX 页数:30 大小:857.30KB
下载 相关 举报
Linux开发环境介绍--g++autoconfautomakePPT课件.pptx_第1页
第1页 / 共30页
Linux开发环境介绍--g++autoconfautomakePPT课件.pptx_第2页
第2页 / 共30页
Linux开发环境介绍--g++autoconfautomakePPT课件.pptx_第3页
第3页 / 共30页
Linux开发环境介绍--g++autoconfautomakePPT课件.pptx_第4页
第4页 / 共30页
Linux开发环境介绍--g++autoconfautomakePPT课件.pptx_第5页
第5页 / 共30页
点击查看更多>>
资源描述

1、Linux开发环境介绍 简介(一) gcc/g+, Makefile, autoconf,automake,Introduction to Linux Dev Env. (Ser. 1) Compile&Distribution.,Delivered By LiHaofounder(Shanghai),Agenda,概述 (Overview)gcc/g+ 及相关参数介绍autoconf, automake, Configure , Makefile, Libtools, GDB介绍内存泄露检测工具介绍 (Valgrind, etc.)Lex介绍YACC介绍,gcc/g+,gcc/g+gcc默认

2、是处理.c的文件,使用c的方式来进行链接。g+默认是处理.cxx/.hxx的文件,使用c+方式来进行链接。编译器在执行编译时(How to) 1)进行预处理,输出 .i文件 ,主要处理一些宏定义之类的代码。预处理器:cpp2) 将预处理后的文件生成汇编文件 ,.s文件。编译器:egcs,gcc/g+,3) 将汇编文件编译成目标文件 .o文件。汇编器as 4) 链接目标代码,生成可执行文件。链接器 ld实例介绍 - (filename: test.cpp)#include #define TEXT “hello” #define SIZE 1024 int main (int argc, cha

3、r* argv) printf (“the Message:%s, the size:%d”, TEXT, SIZE);return 0; ,gcc/g+ options introduction-compile,注意()关于所以选项都为大小写敏感,及 E 和e代表不同的编译选项(如果存在着这两个选项)。 -E 进行预处理,例如:对编译选项#ifdef #else #endif ,#define进行处理,但不产生输出文件,如果要查询 预处理后文件,将该结果进行重定向即可。 g+ -E test.cpp test_after_pre.text-S 进行预处理并对该文件进行汇编处理。 g+ -S

4、test.cpp & ls l *.s -c 进行预处理,编译,汇编并生成目标文件(.o文件),通常我们在makefile文件中使用此项命令进行编译并生成目标文件(当然可以使用makefile默认编译规则)。 g+ -c test.cpp & ls l *.o -o 指定编译后输出可执行文件名。 g+ -c test.cpp o test,gcc/g+ options introduction-directory/file opts,目的:指定在编译时所寻找缺失文件的所在目录或文件。-I dir 在编译指定查找头文件所在的目录。g+ -c test.cpp o test I/usr/local

5、/includes -i filename 指定头文件,相对于#include “filename” g+ -c test.cpp o test -itest.h-L 在链接时指定查找库文件所在的目录 g+ -c test.cpp o test L/usr/local/libs-l Filename 指定链接时库文件名称 libFilename.a(可以使用-l libFilename或者-lfilename) g+ -c test.cpp o test lpthread -lnsl,gcc/g+ options introduction-directory/file opts,选择匹配的顺序

6、() 1)当前路径 2)用户指定的路径(即我们参数说指定的)3)环境变量指定的路径,即 PATH, LD_LIBRARY_PATH, 多个路径使用 : 分割. 我们可以使用export,命令设置自己的环境变量,亦可以编辑/.bashrc或者.profile等文件来设置,每次登陆后就使用当前的环境4)系统默认的路径5)ld.so的环境变量(运行时)6)编程时候手动指定路径More (reference to ),gcc/g+ options introduction-debug opts,目的:产生调试信息。 -g 以操作系统的本地格式,产生调试信息. GDB能够使用这些调试信息。 g+ -c

7、g test.cpp o test-ggdb 以本地格式(如果支持)输出调试信息,尽可能包括 GDB 扩展。 g+ -c ggdb test.cpp o test-glevel 请求生成调试信息,同时用level指出需要多少信息。默认的level值是2。 g+ -c g test.cpp o test,gcc/g+ options introduction-link opts,目的:指定链接时所使用的方式。-static 此选项将禁止使用动态库。优点:程序运行不依赖于其他库缺点:文件比较大-shared (-G) 此选项将尽量使用动态库,为默认选项优点:生成文件比较小缺点:运行时需要系统提供动

8、态库在我们现行系统中使用的是动态链接方式,因此可以看到在dist目录下有许多.so文件(动态库文件)。,gcc/g+ options introduction-warning opts,目的:保证开发出健壮稳定的代码-Wall 一般使用该选项,gcc/g+将提供所有有用的警告。 g+ -c Wall test.cpp o test -Wwarning 标记指定的警告。-pedantic 允许发出ANSI/ISO C标准所列出的所有警告-pedantic-errors 允许发出ANSI/ISO C标准所列出的错误-werror 把所有警告转换为错误,以在警告发生时中止编译过程-w关闭所有警告,建

9、议不要使用此项 ,gcc/g+ options introduction-pre-compile/other opts,目的:在编译时提供一些宏的操作,例如#debug.-Dmacro_name 等价于语言中的#define macro_name -Dmacro=defn 等价于语言中的#define macro=defn -Umacro 等价于语言中的#undef macro -undef 取消对任何非标准宏的定义-O 优化选项,一般不建议使用。-fpic 编译器就生成位置无关目标码.适用于共享库 (shared library)。?(共享库与动态库区别?)-fPIC 编译器就输出位置无关目

10、标码。适用于动态连接(dynamic linking),即使分支需要大范围转移。,gcc/g+ options introduction-common probls.,尽量使用动态库方式进行编译连接,这样生成的可执行文件较小。strip 在release前使用strip命令对可执行文件进行混淆处理,已使用其他人无法进行反编译。 strip exeFile尽量使用-v 参数,该参数会在执行过程中显示详细的信息。 g+ -v c test.cpp o test readelf 使用readelf 命令来查看库文件中的符号(一般在 link时,报un-reference sybomals 错误时)。

11、 readelf -s libfilename.a,gcc/g+ options introduction-common probls.,objdump 具有与 readelf 相似的功能,建议相互配合使用。 objdump -t lilibname.aldd 查看.so及可执行文件所使用的动态库链接情况(一般在link时出现unreference library: xxx.so时候使用该命令查看)。 ldd libfilename_FILE_, _LINE_, _FUNCTION_ 三个宏的使用。如果不使用第三方的日志系统时,可以在程序中使用这三个宏来方便问题定位。 _FILE_ 当前代码所

12、在的文件名。 _LINE_ 当前代码所在的行号。 _FUNCTION_ 当前代码所在的函数名称。,Makefile编写介绍-综述(Overview),目的: make 是Unix/Linux下对源码自动维护的工具,make在坚持完相关的规则和动作关系文件(Makefile, GNUMakefile,makefile, etc.)后,根据文件的修改情况,执行相应的动作(通常是执行编译/链接命令),从而保证最终的目标文件能够及时反映最新的修改。作用: 避免我们重复的输入编译命令。 加快编译速度。 可以建立man手册文件。 可以自动将可执行目标文件发布到指定目录下。,Makefile编写介绍-编写(

13、Build a new Makefile),通常Makefile是由一堆的规制,依赖已经动作组成。规则: 描述如何生成目标,或者说使用哪些命令来根据依赖模块产生目标。这就是command。依赖: makefile关系依赖:规定了最终得到的应用 程序跟生成它的各个源文件之间的关系。动作: 由一组gcc/g+编译命令或者shell命令组成, 或者是其他的可执行文件。,Makefile编写介绍-编写(Build a new Makefile),Makefile 规则定义:Target: 目标,通常是我们要获得的结果dependency: 依赖关系,即生成Target时所需要依赖的文件。command

14、: 是满足上面条件后所指向的操作,其紧跟在Target: dependency下一行,并以tab键打头。通常的格式如下: target : dependency depenency . commandcommand.例如: PatternRecognition:$(OBJS)$(GCC) -o $ $(OBJS) main.o:$(MAINDIR)/src/main.cpp$(GCC) -c $ $(CPPFLAG) pattern.o:$(PATTERNDIR)/src/pattern.cpp$(GCC) -c $ $(CPPFLAG),Makefile编写介绍-编写(Build a new

15、 Makefile),问题:当我们Makefile中的所依赖的关系较多时(有可能是巨多),而在其它地方也需要使用怎么办?解决方案:使用变量。优势: 用代表某些多处使用而又可能发生变化的内容,节省重复修改的工作,避免遗漏。一般用来代表一些文件名或选项。方法: VARNAME=some_text .OBJS := howdy.o helper.o变量引用:$(VARNAME)或 $VARNAME) gcc $(OBJS) o test变量扩展:VARNAME += $(VARNAME) some_textn, 或者VARNAME := some_textn $(VARNAME) (推荐此种格式)

16、OBJS += $(OBJS) new_var1 new_var2 new_varN,Makefile编写介绍-编写(Build a new Makefile),系统自动变量介绍例如:Main.o:/leehao/main/src/main.cpp /leehao/main/inc/header1.h $ 规则的目标所对应的文件名 $ = Main.o $ 规则中的第一个相关文件名 $ =/leehao/main/src/main.cpp$ 规则中所有相关文件的列表,以空格为分隔符 $ = /leehao/main/src/main.cpp /leehao/main/inc/header1.h

17、$? 规则中日期新于目标的所有相关文件的列表 $=/leehao/mian/src/main.cpp (假如:main.cpp被修改)$(D) 目标文件的目录部分 $(D) =/leehao/main/src$(F) 目标文件的文件名部分 $(F) =Main,Makefile编写介绍-编写(Build a new Makefile),系统中的一些默认预定义变量 CC C编译程序,默认值=ccCFLAGS 传给C编译器的标志CPP C+编译程序,默认值=cppCPPFLAGS C+编译时的编译器标志LDFLAGS 传给链接程序(ld)的标志,默认值=AR 归档维护程序,默认值=arARFLAG

18、S 默认值=rvAS 汇编程序,默认值=asASFLAGS 汇编器编译标志,Makefile编写介绍-编写(Build a new Makefile),g+的选项:MM可以显示各个文件之间的依赖关系。一个具体的Makefile实例:其它高级用法 1)分支语法 2)函数用法 3)自定义函数 (define) define run-yaccyacc $(firstword $)mv y.tab.c $ endef 见官方文档.,Configure 介绍-综述(Overview)。,目的: 对于一个大型的项目来说,手工编写Makefile几乎是一件 不可能的事情,特别对于那些源码目录结构复杂,源码文

19、件众多的项目来说。因此,autoConf和automak解决了我们的难题,使得我们较为容易的编译和发布我们的系统。,Configure 介绍-结构(Framework)。,autoconf的框架图,其中:椭圆标示的为 所需执行的命令,Configure 介绍-构建一个configure文件。,下面我们根据上面的框架图,来构建一个 configure文件。1)首先我们使用autoscan 命令对我们的源码进行扫描以获得我们当前项目的目录结构和并对以一些参数设置初始值,其产生的文件:configure.scan文件。2)使用vi/emacs编辑configure.scan文件,并其编辑后的结果从命

20、名为 configure.in/configure.ac (.in即配置文件, .ac即auto conf)3)执行aclocal 为configure.in文件生成相应的.m4文件,该命令生成:aclocal.m4 文件, .m4文件中定义了一些在configure文件中所用的宏及其定义。4) 运行autconf 系统将根据configure.in以及acloacl.m4文件生成 configure脚本文件,Configure 介绍-configure文件结构说明,一个configure.in 的文件格式通常如下:AC_INIT (此开始) 测试程序 测试函数库 测试头文件 测试类型定义 测

21、试结构 测试编译器特性 测试库函数 测试系统调用 AC_OUTPUT (以此结束),Configure 介绍。,Configure 介绍-autoheader。,5)执行autoheader 该命令的的执行后,根据configure.in文件,为系统生成一个configure.h.in 文件,而该文件将被下面的makefile.am所需要。6)执行automake命令,生成我们Makefile的原型模板文件Makefile.in文件,我们可以通过修改该文件来定制我们自己的Makefile(前提:我们不在执行上述步骤,否则该文件将被覆盖,重新生成。),Configure 介绍-automake,

22、automake 中所使用的一些重要的宏及其说明$(top_srcdir) 工程最顶层目录,用于引用源程序;$(top_builddir) 定义了生成目标文件上最上层目录,用于引用.o等编译出来的目标文件。includedir 头文件的路径,等同于-I;也可以使用libfooincludedir指定特定的库引用的头文件路径;include_HEADERS 定义需要安装的头文件,也可以libfooinclude_HEADERS来指定特定的库需要安装的头文件;一般和libfooincludedir结合使用;,Configure 介绍-automake,data_DATA 需要安装数据文件AUTOM

23、AKE_OPTIONS 使用默认值即可bin_PROGRAMS或lib_LIBRARIES定义要产生的执行文件名 对于可执行文件和静态库类型,如果只想编译,不想安装到系统中,可以用 noinst_PROGRAMS代替bin_PROGRAMS,noinst_LIBRARIES代替lib_LIBRARIES。,Configure 介绍-automake,全局的宏及其定义 INCLUDES 链接时所需要的头文件 LDADD 链接时所需要的库文件 LDFLAGS 链接时所需要的库文件选项标志 EXTRA_DIST 源程序和一些默认的文件将自动打入.tar.gz包,其它文件若要进入.tar.gz包可以用这种办法,比如配置文件,数据文件等等。 SUBDIRS 在处理本目录之前要递归处理哪些子目录 CLEANDIRS 需要删除的目录 MOSTLYCLEANFILES 需要删除的文件IMPORTAN: 如果需要可能在上述命令执行过程重新生成配置,此时执行请重新执行aclocal;autoheader;libtoolize -force;automake -a; utoreconf一系列命令,然后./configure,Q&A,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 网络科技 > linux/Unix相关

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


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

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

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