Linux开发环境介绍 简介(一) gcc/g++, Makefile, autoconf,automake

Slides:



Advertisements
Similar presentations
海阔凭鱼跃 天高任鸟飞 Autoconf 介绍 李俊良 2010/08/18. 内容大纲 学习目的 Autoconf 介绍 Autoconf 框架图 Autoconf 流程 Autoconf 优化 Autoconf 小结 FAQ.
Advertisements

LSF系统介绍 张焕杰 中国科学技术大学网络信息中心
嵌入式系统讲义 第5章 嵌入式系统软件开发环境与工具
第1讲 实验环境.
LINUX 环境下程序开发基础 曙光用户培训课程系列 课程时间:1.5小时 更新日期:2008年3月.
基于操作系统的编程复习 张玉宏
第11章 gcc的使用与开发.
C语言实验 第一课 标题:学号+姓名.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
在PHP和MYSQL中实现完美的中文显示
LSF系统介绍 张焕杰 中国科学技术大学网络信息中心
Linux环境下程序编译 曙光信息产业(北京)有限公司.
Linux Programming Prerequisite
张吉豫 GNU编译工具链使用简介 张吉豫
第二讲 搭建Java Web开发环境 主讲人:孙娜
学习前的准备工作 讲师:burning.
编译与多文件.
陈香兰 助教:陈博、李春华 Spring 2009 嵌入式操作系统 陈香兰 助教:陈博、李春华 Spring 2009.
SVN服务器的搭建(Windows) 柳峰
网络常用常用命令 课件制作人:谢希仁.
第11章:一些著名开源软件介绍 第12章:服务安装和配置 本章教学目标: 了解当前一些应用最广泛的开源软件项目 搭建一个网站服务器
大数据管理技术 --NoSQL数据库 HBase 陈 辉 大数据分析技术.
Head 编 译 吴 磊.
DM81X 视频采集处理 ——简单采集显示例程讲解 广州创龙电子科技有限公司
永远的 Autotools ——GNU Build System 简介(一)
PostgreSQL 8.3 安装要点 四川大学计算机学院 段 磊
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
SDL2 配置 (Windows + Visual Studio)
文件读写实践 广州创龙电子科技有限公司 01 广州创龙电子科技有限公司
第十章 IDL访问数据库 10.1 数据库与数据库访问 1、数据库 数据库中数据的组织由低到高分为四级:字段、记录、表、数据库四种。
2019/1/12 GDP设计协同 超级管理员操作手册 GDP项目组.
单元测试工具XUnit 任课老师:黄武 下午2时20分 25.
中国科学技术大学计算机系 陈香兰(0551- ) Spring 2009
VSS使用简介 王树升
东软集团(大连)有限公司 SVVD事业部-于忠华
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
Gzip编译及调试 曹益华
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
三:基于Eclipse的集成开发环境搭建与使用
Visual Studio 2010简捷入门.
编程作业3:网页正文抽取 (10分).
录制回放工具使用说明 鲁晓宇
C语言程序设计 主讲教师:陆幼利.
EBNF与操作语义 请用扩展的 BNF 描述 javascript语言里语句的结构;并用操作语义的方法描述对应的语义规则
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
第1章 c++概述 1.1 C++语言的简史及特点 1.2 简单的C++程序 1.3 C++语言的基本组成
Drupal Dev 我想知道:什么时候、什么变化.
C语言环境配置.
Platform Builder使用介绍 WINCE系统应用开发流程说明 ACTION RDC 杨 涛 2005.Dec.3th
姚金宇 MIT SCHEME 使用说明 姚金宇
工业机器人知识要点解析 (ABB机器人) 主讲人:王老师
项目二:HTML语言基础.
第4章 Excel电子表格制作软件 4.4 函数(一).
iSIGHT 基本培训 使用 Excel的栅栏问题
《手把手教你学STM32-STemWin》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司
LOGIX500软件入门 西安华光信息技术有限公司 2008年7月11日.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
Visual Basic程序设计 第13章 访问数据库
临界区问题的硬件指令解决方案 (Synchronization Hardware)
本节内容 C语言的汇编表示 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
Python 环境搭建 基于Anaconda和VSCode.
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第6章 嵌入式软件开发基础.
嵌入式Linux编程环境.
第四章 UNIX文件系统.
FVX1100介绍 法视特(上海)图像科技有限公司 施 俊.
创建、启动和关闭Activity 本讲大纲: 1、创建Activity 2、配置Activity 3、启动和关闭Activity
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
百万行、千万行数据查询教程 老黄牛.
Presentation transcript:

Linux开发环境介绍 简介(一) gcc/g++, Makefile, autoconf,automake Delivered By LiHao @founder(Shanghai) Introduction to Linux Dev Env. (Ser. 1) Compile&Distribution.

Agenda 概述 (Overview) gcc/g++ 及相关参数介绍 autoconf, automake, Configure , Makefile, Libtools, GDB介绍 内存泄露检测工具介绍 (Valgrind, etc.) Lex介绍 YACC介绍

gcc/g++ gcc/g++ gcc默认是处理.c的文件,使用c的方式来进行链接。 g++默认是处理.cxx/.hxx的文件,使用c++方式来进行链接。 编译器在执行编译时(How to) 1)进行预处理,输出 .i文件 ,主要处理一些宏定义之类的代码。 预处理器:cpp 2) 将预处理后的文件生成汇编文件 ,.s文件。 编译器:egcs

gcc/g++ 3) 将汇编文件编译成目标文件 .o文件。 汇编器as 4) 链接目标代码,生成可执行文件。 链接器 ld 4) 链接目标代码,生成可执行文件。 链接器 ld 实例介绍 --- (filename: test.cpp) #include <stdio.h> #define TEXT “hello” #define SIZE 1024 int main (int argc, char* 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 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/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 选择匹配的顺序() 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 –g test.cpp –o test -ggdb 以本地格式(如果支持)输出调试信息,尽可能包括 GDB 扩展。 g++ -c –ggdb test.cpp –o test -glevel 请求生成调试信息,同时用level指出需要多少信息。默认的level值是2。

gcc/g++ options introduction---link opts 目的:指定链接时所使用的方式。 -static 此选项将禁止使用动态库。 优点:程序运行不依赖于其他库 缺点:文件比较大 -shared (-G) 此选项将尽量使用动态库,为默认选项 优点:生成文件比较小 缺点:运行时需要系统提供动态库   在我们现行系统中使用的是动态链接方式,因此可以看到在dist目录下有许多.so文件(动态库文件)。

gcc/g++ options introduction---warning opts 目的:保证开发出健壮稳定的代码 -Wall 一般使用该选项,gcc/g++将提供所有有用的警告。 g++ -c –Wall test.cpp –o test -W{warning} 标记指定的警告。 -pedantic 允许发出ANSI/ISO C标准所列出的所有警告 -pedantic-errors 允许发出ANSI/ISO C标准所列出的错误 -werror 把所有警告转换为错误,以在警告发生时中止编译过程 -w 关闭所有警告,建议不要使用此项 

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 编译器就输出位置无关目标码。适用于动态连接(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 错误时)。 readelf -s libfilename.a

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

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

Makefile编写介绍---编写(Build a new Makefile) 规则: 描述如何生成目标,或者说使用哪些命令来根据依赖模块产生目标。这就是command。 依赖: makefile关系依赖:规定了最终得到的应用 程序跟生成它的各个源文件之间的关系。 动作: 由一组gcc/g++编译命令或者shell命令组成, 或者是其他的可执行文件。

Makefile编写介绍---编写(Build a new Makefile) Target: 目标,通常是我们要获得的结果 dependency: 依赖关系,即生成Target时所需要依赖的文件。 command: 是满足上面条件后所指向的操作,其 紧跟在Target: dependency下一行, 并以tab键打头。 通常的格式如下: target : dependency [depenency [...] ] command [...] 例如: 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 Makefile) 解决方案:使用变量。 优势: 用代表某些多处使用而又可能发生变化的内容,节省重复修改的工作,避免遗漏。一般用来代表一些文件名或选项。 方法: VARNAME=some_text [...] OBJS := howdy.o helper.o 变量引用:$(VARNAME)或 ${VARNAME) gcc $(OBJS) –o test 变量扩展:VARNAME += $(VARNAME) some_textn, 或者VARNAME := some_textn $(VARNAME) (推荐此种格式) 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 $? 规则中日期新于目标的所有相关文件的列表 $^=/leehao/mian/src/main.cpp (假如:main.cpp被修改) $(@D) 目标文件的目录部分 $(@D) =/leehao/main/src $(@F) 目标文件的文件名部分 $(@F) =Main

Makefile编写介绍---编写(Build a new Makefile) 系统中的一些默认预定义变量 CC C编译程序,默认值=cc CFLAGS 传给C编译器的标志 CPP C++编译程序,默认值=cpp CPPFLAGS C++编译时的编译器标志 LDFLAGS 传给链接程序(ld)的标志,默认值= AR 归档维护程序,默认值=ar ARFLAGS 默认值=rv AS 汇编程序,默认值=as ASFLAGS 汇编器编译标志

Makefile编写介绍---编写(Build a new Makefile) g++的选项:MM可以显示各个文件之间的依赖关系。 一个具体的Makefile实例: 其它高级用法 1)分支语法 2)函数用法 3)自定义函数 (define) define run-yacc yacc $(firstword $^) mv y.tab.c $@ endef 见官方文档.

Configure 介绍---综述(Overview)。 目的: 对于一个大型的项目来说,手工编写Makefile几乎是一件 不可能的事情,特别对于那些源码目录结构复杂,源码文件众多的项目来说。 因此,autoConf和automak解决了我们的难题,使得我们较为容易的编译和发布我们的系统。

Configure 介绍---结构(Framework)。 autoconf的框架图 其中:椭圆标示的为 所需执行的命令

Configure 介绍---构建一个configure文件。 1)首先我们使用autoscan 命令对我们的源码进行扫描以获得我们当前项目的目录结构和并对以一些参数设置初始值,其产生的文件:configure.scan文件。 2)使用vi/emacs编辑configure.scan文件,并其编辑后的结果从命名为 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 (此开始) 测试程序 测试函数库 测试头文件 测试类型定义 测试结构 测试编译器特性 测试库函数 测试系统调用 AC_OUTPUT (以此结束)

Configure 介绍。 宏 含义 AC_INIT(FILE) 用来检查源代码所在的路径。 AM_INIT_AUTOMAKE(PACKAGE, VERSION) 这个宏是必须的,它描述了我们将要生成的软件包的名字及其版本号:PACKAGE是软件包的名字,VERSION是版本号。当你使用make dist命令时,它会给你生成一个类似helloworld-1.0.tar.gz的软件发行包,其中就有对应的软件包的名字和版本号。 AC_PROG_CC 检查系统所用的C编译器。 AC_CHECK_LIB (library, function, [action-if-found], [action-if-not-found], [other-libraries]) 该宏用来检查lib库中是否存在指定的函数。当测试成功时,执行shell命令action_if_found或者action_if_found当为空时,在输出变量LIBS中添加-llib。 action_if_not_found把-lother_libs选项传给link命令。 AC_OUTPUT 要输出的Makefile的名字。 AC_LANG_CPLUSPLUS 对C++语言的支持。 AC_PROG_LIBTOOL 对libtool工具的支持。 AC_CHECK_HEADERS 检查系统中或环境路径中是否存在指定的头文件,和AC_CHECK_LIB一样支持条件语句。 AC_CHECK_FUNCS 检查library functions,和AC_CHECK_LIB一样支持条件语句。

Configure 介绍---autoheader。 该命令的的执行后,根据configure.in文件,为系统生成一个configure.h.in 文件,而该文件将被下面的makefile.am所需要。 6)执行automake命令,生成我们Makefile的原型模板文件Makefile.in文件,我们可以通过修改该文件来定制我们自己的Makefile(前提:我们不在执行上述步骤,否则该文件将被覆盖,重新生成。)

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

Configure 介绍---automake data_DATA 需要安装数据文件 AUTOMAKE_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