编译原理与常遇到的名词

SDK

SDK(Software Development Kit)----软件开发工具包

一般都是一些软件工程师为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件时的开发工具的集合。

软件开发工具包括广义上指辅助开发某一类软件的相关文档、范例和工具的集合。

Windows SDK包含了开发该windows版本所需的windows函数和常数定义、API函数说明文档、相关工具和示例。

DLL

DLL即 Dynamic Link Library(动态链接库)。可以看做是API函数的集合体,我们经常会看到一些 .dll 格式的文件,这些文件就是动态链接库文件,跟 .exe 文件不同的是,.dll 文件不能直接执行,他们通常由 .exe 在执行时装入,内含有一些资源以及可执行代码等。其实 Windows 的三大模块就是以 DLL 的形式提供的(Kernel32.dll,User32.dll,GDI32.dll),里面就含有了 API 函数的执行代码。为了使用 DLL 中的 API 函数,我们必须要有 API 函数的声明(.H)和其导入库(.LIB)。导入库可以理解为是为了在 DLL 中找到 API 的入口点而使用的。

Lib

.lib是一种文件名后缀,代表的是静态数据连接库,在windows操作系统中起到链接程序(也可以说是声明)和函数(或子过程)的作用

数据库有静态数据库(.lib文件)和动态数据库(.dll文件)

静态编译将导出声明和实现都放在lib中。编译后所有代码都嵌入到宿主程序

动态编译的LIB文件相当于一个C语言中的h文件,是函数导出部分的声明,而不将实现过程嵌入到程序本身中,编译后只是将函数地址存在宿主程序中,运行到调用函数是调用DLL并载入函数来实现函数的具体操作。

LIB文件是库文件(与DLL文件相类似),供其它程序调用的,直接打不开。

(2)一般的动态库程序有lib文件和dll文件。lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的。如果有dll文件,那么对应的lib文件一般是一些索引信息,具体的实现在dll文件中 (它包含了函数所在的DLL文件和文件中函数位置的信息(入口))。如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。

两种文件的区别

使用lib需注意两个文件:

•.h头文件,包含lib中说明输出的类或符号原型或数据结构。应用程序调用lib时,需要将该文件包含入应用程序的源文件中。

•.LIB文件。

使用dll需注意三个文件:

•.h头文件,包含dll中说明输出的类或符号原型或数据结构的.h文件。应用程序调用dll时,需要将该文件包含入应用程序的源文件中。

•.LIB文件,是dll在编译、链接成功之后生成的文件,作用是当其他应用程序调用dll时,需要将该文件引入应用程序,否则产生错误(如果不想用lib文件或者没有lib文件,可以用WIN32 API函数LoadLibrary、GetProcAddress装载)。

单词:Compile 编译

IDE

集成开发环境(IDE,Integrated
Development Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。

Make和makefile

Makefile 一般windows的IDE都帮我们实现了这个工作

它关系到整个工程的编译规则,一个工程的源文件不计其数,并且按类型放在不同的目录中,makefile定义了规则来指定哪些需要先编译,后编译或者重新编译,它就像一个shell脚本一般----也就是它描述了整个工程的编译,连接等规则

它最大的好处就是----自动化编译,就是只需要一个make指令,整个工程就可以完全自动编译

Make是一个工具,解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令(因为IDE集成了编写,编译,运行),不同平台有不同的make编译工具,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。它们规定的makefile文件格式都不相同,可见,makefile都成为了一种在工程方面的编译方法。

可以把makefile,make看成是编译的过程

CMake

不同Make工具,如GNU Make、QT的qmake、微软的MS nmake、BSD Make(pmake)等,遵循着不同的规范和标准,所执行的Makefile格式也不同。如果软件想跨平台,必须要保证能够在不同平台编译。而如果使用Make工具,必须为不同的Make工具编写不同的Makefile。

CMake是一个比Make工具更高级的编译配置工具,是一个跨平台的、开源的构建系统(BuildSystem)。CMake允许开发者编写一种平台无关的CMakeList.txt文件来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化Makefile和工程文件,如:为Unix平台生成Makefile文件(使用GCC编译),为Windows MSVC生成projects/workspaces(使用VS IDE编译)或Makefile文件(使用nmake编译)。使用CMake作为项目架构系统的知名开源项目有VTK、ITK、KDE、OpenCV、OSG等。

在Linux平台下使用CMake生成Makefile并编译的流程如下:

A、编写CMake配置文件CMakeLists.txt

B、执行命令cmake PATH生成Makefile,PATH是CMakeLists.txt所在的目录。

C、使用make命令进行编译。

Gcc

GNU编译器套件(GNU
Compiler Collection)包括C、C++、Objective-C、Fortran、Java、Ada和Go语言的前端,也包括了这些语言的库(如libstdc++、libgcj等等)。

如:为Unix平台生成Makefile文件(使用GCC编译),为Windows MSVC生成projects/workspaces(使用VS IDE编译)或Makefile文件(使用nmake编译)。

GCC原本作为GNU操作系统的官方编译器,现已被大多数类Unix操作系统(如Linux、BSD、Mac
OS X等)采纳为标准的编译器,GCC同样适用于微软的Windows。

GCC功能与作用:

1、预处理

命令gcc首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。

2、编译

用GCC编译C/C++代码时,它会试着用最少的时间完成编译并且编译后的代码易于调试。易于调试意味着编译后的代码与源代码有同样的执行顺序,编译后的代码没有经过优化。

3、连接

当所有的目标文件都生成之后,gcc就调用ld来完成最后的关键性工作,这个阶段就是连接。在连接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,同时,该程序所调用到的库函数也从各自所在的档案库中连到合适的地方。

4、汇编

汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,.S为后缀的汇编语言源代码文件和汇编,经过预编译和汇编之后都生成以.o为后缀的目标文件。

gcc所遵循的部分约定规则:

1、.c为后缀的文件,C语言源代码文件。

2、.a为后缀的文件,是由目标文件构成的档案库文件。

3、.h为后缀的文件,是程序所包含的头文件。

4、.i 为后缀的文件,是C源代码文件且不应该对其执行预处理。

5、.m为后缀的文件,是Objective-C源代码文件。

6、.o为后缀的文件,是编译后的目标文件。

7、.s为后缀的文件,是汇编语言源代码文件。

以gcc为例:

1,build static library:

#gcc -c *.c

-E Preprocess only; do not compile, assemble or
link

-S Compile only; do not assemble or link

-c Compile and assemble, but do not link

IDE与编译器

IDE是集成开发环境,当然会包含编译器

0.有些IDE是支持多种编译器和多种硬件架构的

1, IDE本身跟硬件没有关系, 是自带的编译器跟平台有关(具体可以说是汇编)

2, 编译器与你是什么架构的CPU是有关的,不同架构的CPU,其机器指令不一样,所以需要不同的编译器

Gcc和make,cmake的区别

1.gcc是GNU Compiler Collection(就是GNU编译器套件),也可以简单认为是编译器,它可以编译很多种编程语言(括C、C++、Objective-C、Fortran、Java等等)。

2.当你的程序只有一个源文件时,直接就可以用gcc命令编译它。

3.但是当你的程序包含很多个源文件时,用gcc命令逐个去编译时,你就很容易混乱而且工作量大

4.所以出现了make工具

make工具可以看成是一个智能的批处理工具,它本身并没有编译和链接的功能,而是用类似于批处理的方式—通过调用makefile文件中用户指定的命令来进行编译和链接的。

5.makefile是什么?简单的说就像一首歌的乐谱,make工具就像指挥家,指挥家根据乐谱指挥整个乐团怎么样演奏,make工具就根据makefile中的命令进行编译和链接的。

6.makefile命令中就包含了调用gcc(也可以是别的编译器)去编译某个源文件的命令。

7.makefile在一些简单的工程完全可以人工手下,但是当工程非常大的时候,手写makefile也是非常麻烦的,如果换了个平台makefile又要重新修改。—(也就是不同平台的makefile格式不同)

8.这时候就出现了Cmake这个工具,cmake就可以更加简单的生成makefile文件给上面那个make用。当然cmake还有其他功能,就是可以跨平台生成对应平台能用的makefile,你不用再自己去修改了。

11.当然如果你用IDE,类似VS这些一般它都能帮你弄好了

**

Apt-get和自己安装的区别

**

apt-get安装的是由源码包编译过的二进制包,供应商在编译过程中已经解决掉包之间的依赖关系的,因此直接安装即可

而使用源码包要make&&make install手动编译,自己解决依赖

源码包和apt-get安装的服务本质上没有区别的,

但是使用源码包可以自定义安装的位置,使用apt-get会把服务安装在系统默认位置

另外使用源码包安装的服务效率高一点

总结:

  • Windows常用的IDE是vs系列,它用于进行开发,以及windows环境下的编译工作,因为是集成开发环境,以下的操作它都会自动帮你实现

  • 而类unix环境下,一般需要用到编译工具

  • Gcc编译器—可以编译各种语言写的程序,因为它包含了它们的库—但是这个仅适用于编译单个或很少的文件

  • Make,makefile是用来进行批量编译的,makefile是乐谱,make是演奏家,根据乐谱来进行编译—但是不同的平台makefile格式不同-----其中makefile就会使用到gcc编译器

  • 所以使用cmake来进行编译,它是一个跨平台的编译工具,能生成普适的makefile文件,并且相同的make工具

  • 编译器是和CPU的架构相关的,因为不同的CPU的机器指令集不相同,所以需要不同的编译器

你可能感兴趣的:(编译原理)