Ubuntu Linux操作系统第3版(微课版) 课件 第9章 CC++编程_第1页
Ubuntu Linux操作系统第3版(微课版) 课件 第9章 CC++编程_第2页
Ubuntu Linux操作系统第3版(微课版) 课件 第9章 CC++编程_第3页
Ubuntu Linux操作系统第3版(微课版) 课件 第9章 CC++编程_第4页
Ubuntu Linux操作系统第3版(微课版) 课件 第9章 CC++编程_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

UbuntuLinux操作系统(第3版)(微课版)第9章C/C++编程能力CAPACITY要求了解Linux平台上C/C++程序的编辑器、编译器和调试器。理解make和Makefile的编译机制,能够使用Autotools产生Makefile。了解GTK+图形用户界面工具包,能够搭建GTK编程环境。使用make和Makefile实现自动编译Linux编程基础基于GTK+的图形用户界面编程9.1Linux编程基础源程序编辑器编辑器Vi(Vim)EmacsgeditNanonotepadqq集成开发环境AnjutaQtCreater9.1Linux编程基础GCC编译器GCC编译的4个阶段9.1Linux编程基础GCC编译器静态连接通常对函数库的连接是在编译时(compiletime)完成的。将所有相关的目标文件与所涉及的函数库(library)连接合成一个可执行文件。由于所需的函数都已合成到程序中,所以程序在运行时就不再需要这些函数库,这样的函数库被称为静态库(staticlibrary)。静态库文件在Linux下的扩展名为.a,称为归档文件(ArchiveFile),文件名通常采用libxxx.a的形式。9.1Linux编程基础GCC编译器动态连接将函数库的连接推迟到程序运行时(runtime)来实现,就要用到动态连接库(dynamiclinklibrary)。Linux下的动态链接库文件的扩展名为.so,文件名通常采用libxxx.so的形式。动态连接库的函数具有共享特性,连接时不会将它们合成到可执行文件中。编译时需通知编译器这些目标文件要用作动态连接库,使用位置无关代码(PositionIndependentCode,PIC,也译为浮动地址代码),具体使用gcc编译器时加上-fPIC选项。9.1Linux编程基础GCC编译器编译C程序gcc[选项][源文件]编译C++程序使用g++命令来进行C++的编译和连接,它会自动调用gcc实现编译。g++[选项][源文件]gcc编译输出选项-E选项:对源文件进行预处理,生成的结果输出到标准输出。-S选项:对源文件进行预处理和编译,也就是编译成汇编代码。-c选项:对源文件进行预处理、编译和汇编,也就是生成目标文件(obj)。9.1Linux编程基础GCC编译器gcc编译优化选项-O1(或者-O)表示优化生成代码。-O2表示进一步优化。-O3比-O2更进一步优化,包括inline函数。-O0表示不进行优化处理。9.1Linux编程基础GCC编译器gcc其他常用选项-g选项表示生成带有调试信息的二进制形式的可执行文件。-Wall选项编译时输出所有的警告信息,建议编译时启用此选项。-I(大写的i)选项后跟目录路径参数,将该路径添加到头文件的搜索路径中,gcc会在搜索标准头文件之前先搜索该路径。-l(小写的L)选项用来指定程序要连接的库,后面紧跟的参数就是库名。-L选项指定要连接的库文件所在的目录路径。多个源文件的编译方法多个文件一起编译。分别编译各个源文件再对编译后输出的目标文件进行连接。9.1Linux编程基础GDB调试器生成带有调试信息的目标代码默认情况下,GCC在编译时没有将调试信息插入到所生成的二进制代码中。如果需要在编译时生成调试信息,可以使用gcc命令的-g或者-ggdb选项。使用gdb命令进行调试获得含有调试信息的目标代码后,即可使用gdb命令进行调试。在命令行中直接执行gdb命令,或者将要调试的程序作为gdb命令的参数。进入GDB交互界面后即可执行具体的GDB子命令。使用make和Makefile实现自动编译Linux编程基础基于GTK+的图形用户界面编程9.2使用make和Makefile实现自动编译make工具make通过Makefile文件维护源程序,实现自动编译。

make[选项][目标名]make命令主要选项:

-f描述文件:指定make编译所依据的描述文件(Makefile)。

-n:只显示生成指定目标的所有执行命令,但并不实际执行。

-p:输出Makefile文件中所有宏定义和目标文件描述。

-d:使用Debug(调试)模式。

-c目录:在读取Makefile之前改变到指定的目录。9.2使用make和Makefile实现自动编译Makefile基础Makefile基本语法Makefile文件通过若干条规则来定义文件依赖关系。每条规则包括目标(target)、条件(prerequisites)和命令(command)三大要素。基本语法格式 目标...:条件...

命令

... ...9.2使用make和Makefile实现自动编译Makefile基础Makefile示例#第1部分textedit:main.oinput.ooutput.ocommand.ofiles.otools.occ-otexteditmain.oinput.ooutput.ocommand.o/files.outils.o#第2部分main.o:main.cdef.hcc-cmain.cinput.o:input.cdef.hcommand.hcc-cinput.coutput.o:output.cdef.hbuffer.hcc-coutput.c9.2使用make和Makefile实现自动编译Makefile基础Makefile示例command.o:command.cdef.hcommand.hcc-ccommand.cfiles.o:files.cdef.hbuffer.hcommand.hcc-cfiles.cutils.o:tools.cdef.hcc-ctools.c#第3部分clean:rmtexteditmain.oinput.ooutput.ormcommand.ofiles.otools.o9.2使用make和Makefile实现自动编译Makefile基础Makefile示例文件依赖关系链9.2使用make和Makefile实现自动编译Makefile基础make基于Makefile的编译机制如果该项目没有编译过,也就是没有生成过目标,那么就根据所给的条件来生成目标,所有源文件都要编译并进行连接。如果该项目已经编译过,生成有目标,一旦条件发生变化,则需要重新生成目标。如果项目的某些源文件被修改,只编译被修改的源文件,并连接生成目标程序。如果项目的某些头文件改变,则需要编译引用了这些头文件的源文件,并连接生成目标程序。make通过比较目标和条件中的文件的修改日期来识别文件是否被修改。如果条件中的文件的日期要比目标中的文件的日期要新,或者目标不存在,那么make就会执行后续定义的命令。9.2使用make和Makefile实现自动编译Makefile的高级特性Makefile示例修改#第1部分objects=main.oinput.ooutput.ocommand.ofiles.outils.o#第2部分textedit:$(objects)cc-oedit$(objects)#第3部分main.o:defs.hinput.o:defs.hcommand.hcommand.o:defs.hcommand.houtput.o:defs.hbuffer.hinsert.o:defs.hbuffer.htools.o:defs.h#第4部分.PHONY:cleanclean:rmedit$(objects)9.2使用make和Makefile实现自动编译Makefile的高级特性隐式规则自动推导文件以及文件依赖关系后面的命令。变量定义可以定义一系列变量,变量一般都是文本字符串。伪目标伪目标并不是一个文件,只是一个标签。使用通配符make支持通配符:“*”、“?”和“[...]”,用于代替一系列的文件。文件包含在一个Makefile文件中可以引用另一个Makefile文件。9.2使用make和Makefile实现自动编译make的工作方式基本功能(1)读入所有的Makefile文件。(2)读入被include语句嵌入的其他Makefile文件。(3)初始化这些文件中的变量。(4)推导隐式规则,并分析所有规则。(5)为所有的目标文件创建依赖关系链。(6)根据依赖关系,决定哪些目标需要重新生成。(7)执行生成目标的命令。9.2使用make和Makefile实现自动编译使用Autotools自动产生MakefileAutotools工作原理一个Autotools项目至少需要一个名为configure的配置脚本和一个名为Makefile.in的Makefile模板。实际上并不需要Autotools来建立Autotools包,configure是在最基本的Shell(sh)上运行的Shell脚本,它检查用户系统获取每个特征,通过模板写出Makefile文件。configure在每个目录中创建所有文件。configure在命令行接受几个选项用于在不同的目录中安装文件。由configure产生的Makefile文件有点复杂,但很标准。它们定义由GNU标准所需的所有标准目标,常用的目标列举如下。make或makeall:创建程序makeinstall:安装程序makedistclean:删除由configure产生的所有文件9.2使用make和Makefile实现自动编译使用Autotools自动产生MakefileAutotools工具AclocalAutoscanAutoconfAutoheaderautomake9.2使用make和Makefile实现自动编译使用Autotools自动产生MakefileAutotools应用示例(1)准备源代码。(2)切换到项目工作目录,执行命令autoscan命令扫描工作目录生成configure.scan文件。(3)将文件configure.scan重命名为configure.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文件。9.2使用make和Makefile实现自动编译使用Autotools自动产生MakefileAutotools应用示例(8)在项目目录下执行automake命令生成Makefile.in文件。通常要使用选项--add-missing让automake自动添加一些必需的脚本文件。(9)在项目目录下执行./congigure命令,基于Makefile.in生成最终的Makefile文件。该命令将一些配置参数添加到Makefile文件中。(10)在项目目录下执行make命令,基于Makefile文件编译源代码文件并生成可执行文件。(11)在项目目录下执行makeinstall命令将编译后的软件包安装到系统中。(12)如果要对外发布,可以在项目目录下执行makedist命令将程序和相关的文档打包为一个压缩文档。使用make和Makefile实现自动编译Linux编程基础基于GTK+的图形用户界面编程9.3基于GTK+的图形用户界面编程GTK+简介GTK+是一套跨多种平台的开放源码图形用户界面工具包。GTK+类似于Windows上的MFC和Win32API、JAVA上的Swing和SWT,是Linux下开发GUI应用程序的主流开发工具之一。GTK+可以用来进行跨平台GUI应用程序的开发。GTK+开发套件基于3个主要的库:Glib、Pango和ATK。GNOME桌面环境以GTK+为基础,为GNOME编写的程序使用GTK+作为其工具箱。9.3基于GTK+的图形用户界面编程部署GTK+编程环境安装GTK+3开发包部署GTK+编程环境首先要提供gcc、g++、gdb、make等编译工具,然后要安装核心的GTK+开发包。执行以下命令安装GTK+3开发包。

sudoapt-getinstalllibgtk-3-dev执行以下命令检查是否安装了GTK+3,查看所安装的具体版本。

pkg-config--modversiongtk+-3.09.3基于GTK+的图形用户界面编程部署GTK+编程环境测试GTK+编程编写源代码文件testgtk.c#include<gtk/gtk.h>intmain(intargc,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");/*将窗口的destroy信号链接到函数gtk_main_quit/*当窗口要被销毁时,获得通告,停止主GTK+循环*/g_signal_connect(window,"destroy",G_CALLBACK(gtk_main_quit),NULL);9.3基于GTK+的图形用户界面编程部署GTK+编程环境测试GTK+编程编写源代码文件testgtk.c/*创建“HelloWorld!”标签*/label=gtk_label_new("HelloWorld!");/*将标签加入主窗口*/gtk_container_add(GTK_CONTAINER(window),label);/*显示所有的GtkWidget构件,包括窗口、标签*/gtk_widget_show_all(window);/*GTK程序必须有一个gtk_main()函数来启动主循环,等待事件发生并响应,直到应用结束*/gtk_main();return0;}执行命令进行编译$gcctestgtk.c-otestgtk`pkg-config--cflags--libsgtk+-3.0`运行所生成的可执行文件$./testgtk9.3基于GTK+的图形用户界面编程部署GTK+编程环境pkg-config工具pkg-config是最为常用的库信息提取工具。pkg-config是通过库提供的一个.pc文件获得库的各种必要信息的,包括版本信息、编译和连接需要的参数等。使用pkg-config工具提取库的编译和连接参数的两个基本前提:

库本身在安装时必须提供一个相应的.pc文件;

pkg-config必须知道要到何处去寻找.pc文件。GTK+及其依赖库支持使用pkg-config工具,通过设置搜索路径来解决寻找库对应的.pc文件的问题,库的头文件的搜索路径的设置变成了对.pc文件搜索路径的设置。9.3基于GTK+的图形用户界面编程使用Glade辅助设计界面Glade简介Glade是一种GTK+应用程序的快速应用开发工具。Glade的设计初衷是将界面设计与应用程序代码分离,界面的修改不会影响到应用程序代码。用Glade设计的用户界面是以XML格式的文件保存的,它们可以通过GTK+对象GtkBuilder被应用程序动态地载入。。Glade安装执行以下命令安装Glade3工具。

sudoapt-getinstallgladeGlade需要GTK+3支持。9.3基于GTK+的图形用户界面编程使用Glade辅助设计界面使用Glade设计图形用户界面新建一个Glade项目9.3基于GTK+的图形用户界面编程使用Glade辅助设计界面使用Glade设计图形用户界面选择顶层容器选择显示组件9.3基于GTK+的图形用户界面编程使用Glade辅助设计界面使用Glade设计图形用户界面Glade项目9.3基于GTK+的图形用户界面编程使用Glade辅助设计界面GTK+结合Glade进行编程编写源代码文件testglade.c#include<gtk/gtk.h>intmain(intargc,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_show_all(window);gtk_main();return0;}9.3基于GTK+的图形用户界面编程使用Glade辅助设计界面GTK+结合Glade进行编程执行命令进行编译$gcctestglade.c-otestglade`pkg-config--cflags--libsgtk+-3.0`运行所生成的可执行文件$./testglade9.3基于GTK+的图形用户界面编程部署集成开发环境AnjutaAnjuta简介Anjuta是一个为GTK+/GNOME编写的集成开发环境,除了支持C和C++编程外,还支持Java、JavaScrip和Python语言的编程。Anjuta主要特性自身提供强大的源程序编辑功能借用Glade工具生成GUI界面内嵌代码级的调试器(调用GDB)使用标准的Linux构建系统工具Auto

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论