GUN/Linux下C/C++编程

学习目标:

以C/C++为例示例如何在Ubuntu系统中建立和使用程序编译和开发环境,如GCC编译器和make工具。

  • 了解Linux平台上C/C++程序的编辑器、编译器和调试器。

  • 理解make和Makefile的编译机制,能够使用Autotools产生Makefile。

  • 了解QT应用程序开发框架,能够部署QT编程环境。

Linux编程基础

编辑器

推荐:Clion、vsCode、Emacs。

GCC(GNU Compiler Collection, GNU编译器套件)编译器

在Linux平台使用C或C++需要了解相应的编译工具GCC。GCC是由GNU开发的编译器,可以在多种软硬件平台编译可执行程序,执行效率比其他编译器高。可以编译C、C++、Java、汇编等语言,也适用于Windows。

GCC编译过程:
GCC编译的四个阶段:
		  预处理      test.i   编译    test.s  汇编        		   连接
test.c -->预处理器(cpp)--> 编译器(ccl) --> 汇编(as) --> test.o --> 连接器 ->test 源代码文件 												 目标文件 libxx.o  可执行文件	源代码    -->    汇编      -->     二进制(不可编译)	  -->    可执行文件(二进制) 								

预处理(Preprocessing)

GCC首先调用cpp(预处理器)命令对源码文件进行预处理。对源代码文件中的包文件和宏定义进行展开和分析,获得处理后的源代码。此阶段一般不产生.i文件,如需要结果来分析预编译语句,可执行cpp命令,或者执行gcc命令时加上选项-E

编译(Compilation)

调用cll(编译器)命令将每个文件编译成汇编代码。编译器取决于源代码的编程语言。此阶段无须产生结果文件.s,如需,执行cll命令,或者执行gcc命令时加上选项-S。所生成的.s文件时汇编源码文件,具有可读性。

汇编(Assembly)

汇编过程指针对汇编语言的步骤,调用as(汇编器)命令进行工作。.s扩展名的汇编语言文件,经过预编译和汇编之后都生成.o扩展名的目标文件。此阶段将每个文件转换为目标代码。目标文件包含用于程序调试或连接的额外信息。是一种二进制的文件。

连接(Linking)

当所有的目标文件都生成之后,GCC就调用id命令来完成最后的关键性工作,即将所有的目标文件和库合并成可执行文件,结果是接近目标文件格式的二进制文件。在连接阶段,所有的目标文件被置于可执行程序中,同时调用到的库函数也从各自所在的库中连接到合适的地方。

静态连接(Compile time)和动态连接(Run time)
连接分为静态连接(Compile time)和动态连接(Run time):

静态连接:将所有相关的目标文件与所涉及到的函数库(Library)连接合成一个可执行文件。由于函数已经合成到程序中了,所以程序运行时就不再需要这些函数库了,这样的函数库被称为静态库(Static Library)。静态库文件在Linux下的扩展名为.a,称为归档文件(Archive File),文件名通常时libxxx.a,在windows下扩展名为.lib,称为库文件(Library File)。
源代码过多会导致编译生成的中间目标文件过多马,而在连接时需要显示地指出每个文件名很不方便,而将目标文件打包(归档)来生成静态库就方便多了。可以使用ar命令创建一个静态库文件:
gcc -c test.c
ar cr libtest.a test.o
将在当前目录生成一个名为libtest.a的静态库文件,-c:只编译不连接。
动态文件:
如果将函数库的连接推迟到程序运行时来实现,就要用到动态连接库(Dynamic Link Library)。Linux下动态链接库文件扩展名.so,文件名通常为libxxx.so,windows下对应.dll文件。
动态链接库具有共享性,连接时不会将他们合并到可执行文件中。在程序运行时,被调用的动态链接库函数将被临时置于内存中某一区域,多有调用它的程序将指向这个代码段,因此这些代码必须使用相对地址而非绝对地址。创建动态链接库的示例:
gcc -fPIC -c file1.c
gcc -fPIC -c file2.c
gcc -shared libtest.so file1.o file2.o
首先使用-fPIC选项生成目标文件,然后使用-shared选项建立动态链接库。
使用静态链接的好处:依赖的动态链接库较少,对动态链接库的版本不会很敏感,兼容性较好,缺点是生成的程序较大。使用动态链接库的好处自然是程序较小,占用内存较少。

总结:静态链接库就是打个包一起放进可执行文件,要啥函数自己调。动态链接库不放进可执行文件中,单独存在目录中,放在相对地址的内存中,程序运行时需要就自己调。

编译程序
以c为例:
编写源代码保存为xxx.c,然后对xxx.c进行预处理、编译、汇编并连接形成可执行文件。
gcc -o xxx xxx.c 				-o:指定输出可执行文件的文件名
完成编译和连接后,可在命令行中执行:
jergon:~# ./xxx
编译C++程序时,其扩展名为.cpp,但gcc命令不会自动与C++程序使用的库连接所以通常使用g++命令来完成。g++和gcc等价,g++编译阶段会调用gcc,只是为了应对C++,如果用g++编译.c文件,则当成C++。
apt install g++

g++ -o xxx xxx.cpp
gcc编译输出选项

-E:对源文件进行预处理,生成的结果输出到屏幕。如需输出一个文件

gcc -o text.i -E test.c

-S:生成汇编代码。

gcc -S test.c

-c:对源文件进行预处理、编译、汇编,生成目标文件。

gcc优化选项

同一条代码可翻译成不同的汇编语言,执行效率也不太一样。共三个级别。

-O1、-O2、-O3优化效果由低到高,但时间反比。

多个源文件的编译方法

如果有多个源文件需要编译,使用GCC有两种方法。

gcc test1.c test2.c -o test
分别编译后连接成test可执行文件。
采用这种方法,源文件有变动,则需重新编译所有文件。
gcc -c test1.c
gcc -c test2.c
gcc -o test test1.o test2.o
分别编译各个源文件再对编译后输出的目标文件进行连接。若有变动,只需重新编译修改后的文件。

但当文件非常多时,就需要使用make工具了。在一个项目中,如果使用一条gcc命令来编译是非常浪费时间的。要解决这个问题,关键是灵活运行GCC,同时借助make这样的工具。

GDB调试器

使用make和Makefile实现自动编译

在一个Project源代码过多时,通过gcc命令的方式进行编译,就显得很低效。因此Linux使用make工具和Makefile文件夹解决这个问题。

Makefile是一种描述文件,用于定义整个软件项目的编译规则,理顺各个源文件之间的相互依赖关系。

make工具基于Makefile文件就可以实现整个项目的完全自动编译。

Makefile对于windows用户来说比较陌生,在windows中编译项目往往是通过IDE实现。


meke工具

make编译工具,主要功能是通过Makefike文件维护源代码,实现自动编译。make可以只对上次修改过的部分进行编译,对未修改的跳过,然后进行连接。

对于自己开发的软件项目,需要使用make命令进行编译,对于以源码形式发布的应用软件,则需要使用make install进行安装。

make命令的基本用法:
make [选项] [目标名]
Makefile

Makefile文件关系到整个项目的编译规则。一个项目源文件通常按类型、功能、模块分别放在若干目录中,Makefike文件则定义一系列规则指定那些文件先编译,那些文件后编译,那些文件需要重新编译等。

Makefile文件一般以Makefile作为文件名。

基本语法:通过若干规则来定义文件依赖关系。每条规则包括目标、条件、命令三大要素。

目标 ... : 条件 ...
命令
...
...

目标是一个目标文件,可以是目标代码文件,也可以是可执行文件,还可以是一个标签。
条件是生成目标文件所需要的文件,可以是源文件,也可以是目标文件。
命令就是make需要执行的命令,可以是任意的Shell命令,也可以是多条命令。

makefile示例:Goolge
使用Autotools自动生成Makefile
apt install autoconf
and
Google

基于GTK+的图形用户界面编程(out?)

GTK+和Qt是跨平台的图形界面开发工具和框架,由于源代码开放,已成为主流的图形用户界面(GUI)应用程序开发框架。

GTK+类似于windows的MFC等。

GTK+虽然是C语言写的,但可以使用主流编程语言来使用它。如C++、Java、PHP、Python等。

使用Glade辅助设计界面

类似于winform的所见即所得。

部署集成开发环境

包含Glade、GCC、GDB、make工具、Autotools工具等。

基于QT的图形用户界面编程

Code less;Create more;Deploy Anywhere

与GTK+相比Qt不仅是GUI库,而且具有编程语言功能,拥有更好的开发环境和工具,能更好的支持桌面、嵌入式和移动应用。它既可以开发GUI程序,也可以开发非GUI程序,如控制台工具和服务器。Qt是一个跨平台应用程序和UI开发框架。使用Qt只需一次性开发应用程序,便可在不同桌面或嵌入式操作系统部署这些应用程序。

经过多年发展,Qt不仅拥有完善的C++图形库,还集成的数据库、OPENGL库、多媒体库、网络、脚本、XML库等,其核心库也加入了进程间通信、多线程等模块。

  1. 具有优秀的跨平台性;

  1. 面向对象

  1. 丰富的API;

  1. 支持2D/3D图形渲染,支持OpenGL;

  1. 支持XML;

Qt的安装
Qt Creator使用

Qt Creator是一个跨平台集成开发环境。

复杂代码编辑器;

版本控制;

生成用户界面设计器;Qwidget

项目和编译管理;

桌面和移动平台;

Qt模拟器;

Qt Designer
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值