1、1 第9章 C/C+编程Ubuntu Linux 操作系统(第 2 版)(微课版)工业和信息化“十三五”人才培养规划教材第9章 C/C+编程2 第9章 C/C+编程能力CAPACITY要求了解Linux平台上C/C+程序的编辑器、编译器和调试器。理解make和Makefile的编译机制,能够使用Autotools产生Makefile。了解GTK+图形用户界面工具包,能够搭建GTK编程环境。了解Qt应用程序开发框架,能够部署Qt编程环境。3 第9章 C/C+编程内容CONTENTS导航使用make和Makefile实现自动编译Linux编程基础基于GTK+的图形用户界面编程基于Qt的图形用户界面
2、编程4 第9章 C/C+编程9.1 Linux编程基础Emacs编辑器简介Emacs是Editor MACroS(宏文本编辑器)的缩写。Emacs提供一个功能全面的集成开发环境,程序员可以用来编写代码、编译程序、收发邮件。Emacs能够在当前大多数操作系统上运行。可以利用Emacs针对某种程序设计语言的编辑模式来更有效率地完成程序编写任务。5 第9章 C/C+编程9.1 Linux编程基础Emacs编辑器Emacs界面主界面Emacs编辑C源码6 第9章 C/C+编程9.1 Linux编程基础Emacs编辑器Emacs命令同时进行编辑和控制,Emacs需要使用组合键来发出控制命令。Emacs的
3、所用命令都以组合键加字母组成。理解文件和缓冲区将文件内容放到一个临时性的缓冲区里面,然后再对缓冲区的内容进行编辑。在通知编辑器保存缓冲区的内容之前,存放在磁盘上的原始文件是不会发生任何变化的。7 第9章 C/C+编程9.1 Linux编程基础Emacs编辑器Emacs编辑模式Emacs针对多种文档定义了不同的主模式(major mode)。每种主模式都提供有特殊的Emacs Lisp变量和函数。一个编辑缓冲区只能有一个主模式。退出一个主模式的方法就是进入另一个主模式。Emacs支持次模式(minor mode)。每一个缓冲区能够同时关联多个次模式。C和C+支持编译和调试8 第9章 C/C+编程
4、9.1 Linux编程基础GCC编译器GCC编译的4个阶段9 第9章 C/C+编程9.1 Linux编程基础GCC编译器静态连接通常对函数库的连接是在编译时(compile time)完成的。将所有相关的目标文件与所涉及的函数库(library)连接合成一个可执行文件。由于所需的函数都已合成到程序中,所以程序在运行时就不再需要这些函数库,这样的函数库被称为静态库(static library)。静态库文件在Linux下的扩展名为.a,称为归档文件(Archive File),文件名通常采用libxxx.a的形式。10 第9章 C/C+编程9.1 Linux编程基础GCC编译器动态连接将函数库的
5、连接推迟到程序运行时(run time)来实现,就要用到动态连接库(dynamic link library)。Linux下的动态链接库文件的扩展名为.so,文件名通常采用libxxx.so的形式。动态连接库的函数具有共享特性,连接时不会将它们合成到可执行文件中。编译时需通知编译器这些目标文件要用作动态连接库,使用位置无关代码(Position Independent Code,PIC,也译为浮动地址代码),具体使用gcc编译器时加上-fPIC选项。11 第9章 C/C+编程9.1 Linux编程基础GCC编译器编译C程序gcc 选项 源文件编译C+程序使用g+命令来进行C+的编译和连接,它会
6、自动调用gcc实现编译。g+选项 源文件gcc编译输出选项-E选项:对源文件进行预处理,生成的结果输出到标准输出。-S选项:对源文件进行预处理和编译,也就是编译成汇编代码。-c选项:对源文件进行预处理、编译和汇编,也就是生成目标文件(obj)。12 第9章 C/C+编程9.1 Linux编程基础GCC编译器gcc编译优化选项-O1(或者-O)表示优化生成代码。-O2表示进一步优化。-O3比-O2更进一步优化,包括 inline 函数。-O0表示不进行优化处理。13 第9章 C/C+编程9.1 Linux编程基础GCC编译器gcc其他常用选项-g选项表示生成带有调试信息的二进制形式的可执行文件。
7、-Wall选项编译时输出所有的警告信息,建议编译时启用此选项。-I选项后跟目录路径参数,将该路径添加到头文件的搜索路径中,gcc会在搜索标准头文件之前先搜索该路径。-L选项后跟库文件参数,用来指定连接声称可执行文件所用的库文件。多个源文件的编译方法多个文件一起编译。分别编译各个源文件再对编译后输出的目标文件进行连接。14 第9章 C/C+编程9.1 Linux编程基础GDB调试器生成带有调试信息的目标代码默认情况下,GCC在编译时没有将调试信息插入到所生成的二进制代码中。如果需要在编译时生成调试信息,可以使用gcc命令的-g或者-ggdb选项。使用gdb命令进行调试获得含有调试信息的目标代码后
8、,即可使用gdb命令进行调试。在命令行中直接执行gdb命令,或者将要调试的程序作为gdb命令的参数。进入GDB交互界面后即可执行具体的GDB子命令。15 第9章 C/C+编程内容CONTENTS导航使用make和Makefile实现自动编译Linux编程基础基于GTK+的图形用户界面编程基于Qt的图形用户界面编程16 第9章 C/C+编程9.2 使用make和Makefile实现自动编译make工具make通过Makefile文件维护源程序,实现自动编译。make 选项 目标名make命令主要选项:-f 描述文件:指定make编译所依据的描述文件(Makefile)。-n:只显示生成指定目标的
9、所有执行命令,但并不实际执行。-p:输出Makefile文件中所有宏定义和目标文件描述。-d:使用Debug(调试)模式。-c 目录:在读取Makefile之前改变到指定的目录。17 第9章 C/C+编程9.2 使用make和Makefile实现自动编译Makefile基础Makefile基本语法Makefile文件通过若干条规则来定义文件依赖关系。每条规则包括目标(target)、条件(prerequisites)和命令(command)三大要素。基本语法格式目标.:条件.命令.18 第9章 C/C+编程9.2 使用make和Makefile实现自动编译Makefile基础Makefile示
10、例#第1部分textedit:main.o input.o output.o command.o files.o tools.occ-o textedit main.o input.o output.o command.o/files.o utils.o#第2部分main.o:main.c def.hcc-c main.cinput.o:input.c def.h command.hcc-c input.coutput.o:output.c def.h buffer.hcc-c output.c19 第9章 C/C+编程9.2 使用make和Makefile实现自动编译Makefile基础Ma
11、kefile示例command.o:command.c def.h command.hcc-c command.cfiles.o:files.c def.h buffer.h command.hcc-c files.cutils.o:tools.c def.hcc-c tools.c#第3部分clean:rm textedit main.o input.o output.o rm command.o files.o tools.o20 第9章 C/C+编程9.2 使用make和Makefile实现自动编译Makefile基础Makefile示例文件依赖关系链21 第9章 C/C+编程9.2 使
12、用make和Makefile实现自动编译Makefile基础make基于Makefile的编译机制如果该项目没有编译过,也就是没有生成过目标,那么就根据所给的条件来生成目标,所有源文件都要编译并进行连接。如果该项目已经编译过,生成有目标,一旦条件发生变化,则需要重新生成目标。如果项目的某些源文件被修改,只编译被修改的源文件,并连接生成目标程序。如果项目的某些头文件改变,则需要编译引用了这些头文件的源文件,并连接生成目标程序。make通过比较目标和条件中的文件的修改日期来识别文件是否被修改。如果条件中的文件的日期要比目标中的文件的日期要新,或者目标不存在,那么make就会执行后续定义的命令。22
13、 第9章 C/C+编程9.2 使用make和Makefile实现自动编译Makefile的高级特性Makefile示例修改#第1部分objects=main.o input.o output.o command.o files.o utils.o#第2部分textedit:$(objects)cc-o edit$(objects)#第3部分main.o:defs.hinput.o:defs.h command.hcommand.o:defs.h command.houtput.o:defs.h buffer.hinsert.o:defs.h buffer.htools.o:defs.h#第4部
14、分.PHONY:cleanclean:rm edit$(objects)23 第9章 C/C+编程9.2 使用make和Makefile实现自动编译Makefile的高级特性隐式规则自动推导文件以及文件依赖关系后面的命令。变量定义可以定义一系列变量,变量一般都是文本字符串。伪目标伪目标并不是一个文件,只是一个标签。使用通配符make支持通配符:“*”、“?”和“.”,用于代替一系列的文件。文件包含在一个Makefile文件中可以引用另一个Makefile文件。24 第9章 C/C+编程9.2 使用make和Makefile实现自动编译make的工作方式基本功能(1)读入所有的Makefile文
15、件。(2)读入被include语句嵌入的其他Makefile文件。(3)初始化这些文件中的变量。(4)推导隐式规则,并分析所有规则。(5)为所有的目标文件创建依赖关系链。(6)根据依赖关系,决定哪些目标需要重新生成。(7)执行生成目标的命令。25 第9章 C/C+编程9.2 使用make和Makefile实现自动编译使用Autotools自动产生MakefileAutotools工作原理一个Autotools项目至少需要一个名为configure的配置脚本和一个名为Makefile.in的Makefile模板。实际上并不需要Autotools来建立Autotools包,configure是在最
16、基本的Shell(sh)上运行的Shell脚本,它检查用户系统获取每个特征,通过模板写出Makefile文件。configure在每个目录中创建所有文件。configure在命令行接受几个选项用于在不同的目录中安装文件。26 第9章 C/C+编程9.2 使用make和Makefile实现自动编译使用Autotools自动产生MakefileAutotools工作原理由configure产生的Makefile文件有点复杂,但很标准。它们定义由GNU标准所需的所有标准目标,常用的目标列举如下。p make或make all:创建程序p make install:安装程序p make distcle
17、an:删除由configure产生的所有文件27 第9章 C/C+编程9.2 使用make和Makefile实现自动编译使用Autotools自动产生MakefileAutotools工具AclocalAutoscanAutoconfAutoheaderautomake28 第9章 C/C+编程9.2 使用make和Makefile实现自动编译使用Autotools自动产生MakefileAutotools应用示例(1)准备源代码。(2)切换到项目工作目录,执行命令autoscan命令扫描工作目录生成configure.scan文件。(3)将文件configure.scan重命名为config
18、ure.ac,然后再编辑修改这个配置文件。(4)在项目目录下执行aclocal命令,扫描configure.ac文件生成aclocal.m4文件。(5)在项目目录下执行autoconf命令生成configure文件。(6)在项目目录下执行autoheader命令生成config.h.in文件。(7)在项目目录下创建一个Makefile.am文件,供automake工具根据configure.in中的参数将Makefile.am转换成Makefile.in文件。29 第9章 C/C+编程9.2 使用make和Makefile实现自动编译使用Autotools自动产生MakefileAutotoo
19、ls应用示例(8)在项目目录下执行automake命令生成Makefile.in文件。通常要使用选项-add-missing让automake自动添加一些必需的脚本文件。(9)在项目目录下执行./congigure命令,基于Makefile.in生成最终的Makefile文件。该命令将一些配置参数添加到Makefile文件中。(10)在项目目录下执行make命令,基于Makefile文件编译源代码文件并生成可执行文件。(11)在项目目录下执行make install命令将编译后的软件包安装到系统中。(12)如果要对外发布,可以在项目目录下执行make dist命令将程序和相关的文档打包为一个压
20、缩文档。30 第9章 C/C+编程内容CONTENTS导航使用make和Makefile实现自动编译Linux编程基础基于GTK+的图形用户界面编程基于Qt的图形用户界面编程31 第9章 C/C+编程9.3 基于GTK+的图形用户界面编程GTK+简介GTK+是一套跨多种平台的开放源码图形用户界面工具包。GTK+类似于Windows上的MFC和Win32 API、JAVA上的Swing和SWT,是Linux下开发GUI应用程序的主流开发工具之一。GTK+可以用来进行跨平台GUI应用程序的开发。GTK+开发套件基于3个主要的库:Glib、Pango和ATK。GNOME桌面环境以GTK+为基础,为G
21、NOME编写的程序使用GTK+作为其工具箱。32 第9章 C/C+编程9.3 基于GTK+的图形用户界面编程部署GTK+编程环境安装GTK+3开发包部署GTK+编程环境首先要提供gcc、g+、gdb、make等编译工具,然后要安装核心的GTK+开发包。执行以下命令安装GTK+3开发包。sudo apt-get install libgtk-3-dev执行以下命令检查是否安装了GTK+3,查看所安装的具体版本。pkg-config-modversion gtk+-3.033 第9章 C/C+编程9.3 基于GTK+的图形用户界面编程部署GTK+编程环境测试GTK+编程#include int m
22、ain(int argc,char*argv)/*声明GtkWidget构件*/GtkWidget*window;GtkWidget*label;/*调用GTK初始化函数,这在所有的GTK程序中都要调用*/gtk_init(&argc,&argv);/*创建主窗口*/window=gtk_window_new(GTK_WINDOW_TOPLEVEL);/*为该窗口设置标题*/gtk_window_set_title(GTK_WINDOW(window),Hello World);34 第9章 C/C+编程9.3 基于GTK+的图形用户界面编程部署GTK+编程环境测试GTK+编程/*将窗口的de
23、stroy信号连接到函数gtk_main_quit*当窗口要被销毁时,获得通告,停止主GTK+循环*/g_signal_connect(window,destroy,G_CALLBACK(gtk_main_quit),NULL);/*创建“Hello,World”标签*/label=gtk_label_new(Hello,World!);/*将标签加入到主窗口*/gtk_container_add(GTK_CONTAINER(window),label);/*显示所有的GtkWidget构件,包括窗口、标签*/gtk_widget_show_all(window);/*GTK程序必须有一个gt
24、k_main()函数启动主循环,等待事件发生并响应,直到应用结束*/gtk_main();return 0;35 第9章 C/C+编程9.3 基于GTK+的图形用户界面编程部署GTK+编程环境pkg-config工具pkg-config是最为常用的库信息提取工具。pkg-config是通过库提供的一个.pc文件获得库的各种必要信息的,包括版本信息、编译和连接需要的参数等。使用pkg-config 工具提取库的编译和连接参数的两个基本前提:p 库本身在安装时必须提供一个相应的.pc文件;p pkg-config必须知道要到何处去寻找.pc文件。GTK+及其依赖库支持使用pkg-config工具,
25、通过设置搜索路径来解决寻找库对应的.pc 文件的问题,库的头文件的搜索路径的设置变成了对.pc文件搜索路径的设置。36 第9章 C/C+编程9.3 基于GTK+的图形用户界面编程 使用Glade辅助设计界面Glade简介Glade是一种GTK+应用程序的快速应用开发工具。Glade的设计初衷是将界面设计与应用程序代码分离,界面的修改不会影响到应用程序代码。用Glade设计的用户界面是以XML格式的文件保存的,它们可以通过GTK+对象GtkBuilder被应用程序动态地载入。Glade安装执行以下命令安装Glade 3工具。sudo apt-get install gladeGlade需要GTK
26、+3支持。37 第9章 C/C+编程9.3 基于GTK+的图形用户界面编程 使用Glade辅助设计界面使用Glade设计图形用户界面新建一个Glade项目38 第9章 C/C+编程9.3 基于GTK+的图形用户界面编程 使用Glade辅助设计界面使用Glade设计图形用户界面选择顶层容器选择显示组件39 第9章 C/C+编程9.3 基于GTK+的图形用户界面编程 使用Glade辅助设计界面使用Glade设计图形用户界面Glade项目40 第9章 C/C+编程9.3 基于GTK+的图形用户界面编程 使用Glade辅助设计界面GTK+结合Glade进行编程#include int main(int
27、 argc,char*argv)GtkBuilder *builder;GtkWidget *window;gtk_init(&argc,&argv);builder=gtk_builder_new();gtk_builder_add_from_file(builder,hello.glade,NULL);window=GTK_WIDGET(gtk_builder_get_object(builder,window1);gtk_builder_connect_signals(builder,NULL);g_object_unref(G_OBJECT(builder);gtk_widget_sh
28、ow_all(window);gtk_main();return 0;41 第9章 C/C+编程9.3 基于GTK+的图形用户界面编程部署集成开发环境AnjutaAnjuta简介Anjuta是一个为GTK+/GNOME编写的集成开发环境,除了支持C和C+编程外,还支持Java、JavaScrip和Python语言的编程。Anjuta主要特性p自身提供强大的源程序编辑功能p借用Glade工具生成GUI界面p内嵌代码级的调试器(调用GDB)p使用标准的Linux构建系统工具Autotoolsp提供应用程序向导帮助程序员快速创建GTK+程序,避免编写重复的代码在Ubuntu系统中安装Anjuta(确
29、认安装有Glade和GTK+):sudo apt-get install anjuta 42 第9章 C/C+编程9.3 基于GTK+的图形用户界面编程部署集成开发环境AnjutaAnjuta基本使用Anjuta初始界面选择项目类型43 第9章 C/C+编程9.3 基于GTK+的图形用户界面编程部署集成开发环境AnjutaAnjuta基本使用设置项目基本信息设置项目选项44 第9章 C/C+编程9.3 基于GTK+的图形用户界面编程部署集成开发环境AnjutaAnjuta基本使用项目结构45 第9章 C/C+编程9.3 基于GTK+的图形用户界面编程部署集成开发环境AnjutaAnjuta基本
30、使用项目的目录及文件46 第9章 C/C+编程9.3 基于GTK+的图形用户界面编程部署集成开发环境AnjutaAnjuta基本使用启动图形界面文件编辑调用Glade编辑图形界面文件47 第9章 C/C+编程9.3 基于GTK+的图形用户界面编程部署集成开发环境AnjutaAnjuta基本使用设置程序参数Anjuta创建的应用程序48 第9章 C/C+编程9.3 基于GTK+的图形用户界面编程部署集成开发环境AnjutaAnjuta基本使用制作项目编译49 第9章 C/C+编程内容CONTENTS导航使用make和Makefile实现自动编译Linux编程基础基于GTK+的图形用户界面编程基于
31、Qt的图形用户界面编程50 第9章 C/C+编程9.4 基于Qt的图形用户界面编程Qt简介Qt的发展Qt是一个跨平台的C+开发库,设计思想是同样的C+代码无需修改就可以在Windows、Linux、Mac OS等平台上使用。Qt起初是由Trolltech(奇趣科技)公司开发的跨平台C+图形用户界面应用程序开发框架。Qt不但拥有了完善的C+图形库,而且近年来的版本逐渐集成了数据库、OpenGL库、多媒体库、网络、脚本库、XML库、WebKit库等。Qt 5是一个全新的用于跨平台应用程序和用户界面开发框架的版本,可应用于桌面、嵌入式和移动应用程序,在性能、功能和易用性方面做了极大的提升。51 第9
32、章 C/C+编程9.4 基于Qt的图形用户界面编程Qt安装在Ubuntu命令行中启动Qt设置向导。提供Qt账户信息52 第9章 C/C+编程9.4 基于Qt的图形用户界面编程Qt安装选择安装组件53 第9章 C/C+编程9.4 基于Qt的图形用户界面编程Qt安装Qt Creator欢迎界面54 第9章 C/C+编程9.4 基于Qt的图形用户界面编程Qt Creator使用Qt的功能和特性复杂代码编辑器。版本控制。集成用户界面设计器:Qt Creator 提供了两个集成的可视化编辑器:用于通过 Qt widget 生成用户界面的 Qt Designer,以及用于通过 QML 语言开发动态用户界面
33、的 Qt Quick Designer。项目和编译管理。桌面和移动平台。Qt模拟器。55 第9章 C/C+编程9.4 基于Qt的图形用户界面编程Qt Creator使用Qt Creator开发示例选择项目模板56 第9章 C/C+编程9.4 基于Qt的图形用户界面编程Qt Creator使用Qt Creator开发示例设置项目名称和路径57 第9章 C/C+编程9.4 基于Qt的图形用户界面编程Qt Creator使用Qt Creator开发示例选择项目要使用的套件58 第9章 C/C+编程9.4 基于Qt的图形用户界面编程Qt Creator使用Qt Creator开发示例设置类信息59 第
34、9章 C/C+编程9.4 基于Qt的图形用户界面编程Qt Creator使用Qt Creator开发示例项目管理汇总信息60 第9章 C/C+编程9.4 基于Qt的图形用户界面编程Qt Creator使用Qt Creator开发示例项目管理界面61 第9章 C/C+编程9.4 基于Qt的图形用户界面编程Qt Creator使用Qt Creator开发示例图形用户界面设计62 第9章 C/C+编程9.4 基于Qt的图形用户界面编程Qt Creator使用Qt Creator开发示例编辑标签文本正常运行结果63 第9章 C/C+编程9.4 基于Qt的图形用户界面编程Qt Creator使用Qt Creator开发示例编译输出信息选择构建方式64 第9章 C/C+编程THANKS