《程序员的自我修养——链接、装载与库》与《C++ Cookbook》笔记

在VS2010中配置OpenCV时,用的是浅墨的安装教程,在配置的过程中遇到一些问题,不知道如何解决,以及不清楚为什么要这样做才可以使用OpenCV。所以在师兄的指点下初略的看了下这两本书,.dll .lib 编译 build 调试等有了一定了解。下面说下自己的认识,后面是两本书的一点笔记,希望大家看过之后,对配置过程不再是一头雾水并且对计算机多一点了解。

浅墨的OpenCV配置,主要是四个步骤:环境变量、包含目录、库目录、附加依赖项

环境变量:当系统运行一个程序而没有告诉他程序所在的完整路径时,系统除了在当前目录下寻找程序外,还应到path指定的路径去找。这里设置的是.dll。如果不设置环境变量,则需要将.dll文件放到应用程序的目录下面。

包含目录:寻找#include<xxxx.h>中的头文件xxxx.h的搜索目录

库目录:寻找.lib文件的搜索目录

附加依赖项:lib库

下面通过对编译(编译、汇编)、链接的讲解说明以上配置的作用。

构建一个应用程序,需要将高级语言转化成计算机能够直接执行的机器指令,IDE就是一个帮助我们完成这个过程的工具,但是IDE将上述过程隐藏了。所以实际上高级程序语言需要经过编译、链接才能形成可执行程序。即源代码.cpp经过编译器生成汇编代码.asm,汇编代码经过汇编器生成目标文件.obj,其中目标文件又可经过归档库生成静态库.lib,最后目标文件和库文件一起生成可执行文件.exe或者动态链接库.dll。

       编译            汇编                链接

.cpp —— .asm —— .obj/.lib —— .exe/dll

程序的模块化:进行程序设计时将一个大程序按照功能划分为若干小程序模块,每个小程序模块完成一个确定的功能,并在这些模块之间建立必要的联系,通过模块的互相协作完成整个功能的程序设计方法。这些模块有些就成了.dll文件。

再回过头来看OpenCV的配置过程,第一个是环境变量的设置,就是设定动态链接库.dll的路径,因为动态链接库是程序在运行的时候再装载到内存中去的,所以要么由环境变量指定路径,或者.dll在应用程序当前的目录中。

第二个是则是与编译相关的步骤,具体没怎么看。

第三个第四个则是和链接相关的步骤,设定好.lib的路径。

至此,我们只要记住,再碰到.dll,.lib文件时,这类文件是要在IDE中设定好路径的。


计算机硬件最为关键的三个部件:中央处理器CPU、内存、I/O控制芯片

CPU的频率一直被4GHz的天花板所限制(今天查的intel最好的处理器5GHz),所有就有多核处理器

系统软件(管理计算机本身的软件):平台性(系统工具)、程序开发(编译器、汇编器、链接器等开发工具和开发库)

接口:每个层次之间的相互通信,通信就必须有一个通信的协议,则为接口

中间层:除了硬件和应用程序,其他都是所谓的中间层,每个中间层都是对它下面的那层的包装和扩展

应用程序的接口的提供者是运行库,什么样的运行库提供什么样的API

操作系统的一个功能就是提供抽象的接口,另一个主要功能是管理硬件资源

进程:所有的应用程序都以进程的方式运行,每个进行都有自己独立的地址空间,使得进程之间的地址空间相互隔离。目标是希望每个进程从逻辑上看都可以独占计算机的资源

线程:程序执行流的最小单元。一个标准的线程由线程ID、当前指令指针、寄存器集合和堆栈组成。通常意义上,一个进程由一个到多个线程组成,每个线程之间共享程序的内存空间及一些进程级的资源

硬件细节都交给了操作系统,具体是操作系统中的硬件驱动程序来完成

构建Build:编译和链接合并在一起的过程

预处理:处理原源代码中的以“#”开始的预编译指令

编译:把预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后产生相应的汇编代码文件

汇编:将汇编代码转变成机器可以执行的指令,每一条汇编语句几乎对应一条机器指令

链接:因为按层次化及模块化组织源代码,所以模块的拼接过程就是链接。主要内容就是把各个模块之间相互引用的部分都处理好,使得各个模块之间能够正确的衔接。链接过程包括地址和空间分配、符号决议、重定位等。目标文件和库一起链接形成最终可执行文件

运行时库:支持程序运行的基本函数集合.DLL

库:一组目标文件的包,就是一些最常用代码编译成目标文件后打包存放

可执行文件格式:Windows下为PE-COFF文件格式,可执行文件.exe、动态链接库.dll、静态链接库.lib 都是按照这个格式存储

可执行文件只有装载到内存以后才可以被CPU执行

动态链接:解决空间浪费和更新困难,就是把程序的模块相互分割开来,形成独立的文件,而不是将它们静态地链接在一起。简单地讲,就是不对那些组成程序的目标文件进行链接,等到程序要运行时才进行链接。这就是动态链接的基本思想

动态链接还有一个特点:程序在运行时可以动态地加载各种程序模块,这个优点后来被用来制作程序的插件

动态链接的步骤:1.启动动态链接器本身 2.装载所有需要的共享对象 3.重定位和初始化

内存:承载程序运行的本质,程序进行各种运算和表达的场所

堆:一块巨大的内存空间,常常占据整个虚拟空间的绝大部分


构建C++应用程序的三种基本任务:构建静态库、构建动态库、构建可执行文件

构建C++应用程序的三个基本工具是编译器complier(源文件为输入,生成目标文件.obj)、归档库archiver(目标文件为输入,生成静态库.lib)、链接器(目标文件和库为输入,生成可执行程序.exe和动态库.dll)

静态库:链接时完整地拷贝至可执行文件中,即构建可执行程序时,才需要它。由目标文件组成。
动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序可以共用,节省内存。包含类、函数和数据的定义。

编译器、链接器、归档器都是命令行工具,它们都是从外壳程序(“提供用户使用界面”的软件,通常指的是命令行界面的解析器)下运行的。

集成开发环境IDE:提供了图形界面,用于组织源文件集合,说明要从中生成哪些二进制文件。IDE把源文件组织成集合,成为项目;把项目组织成项目组或解决方案。

环境变量:当系统运行一个程序而没有告诉他程序所在的完整路径时,系统除了在当前目录下寻找程序外,还应到path指定的路径去找。加载动态库时,也会查找path中的目录。

传递给编辑器的信息:输入文件名、输出文件名、要查找的文件的位置、通常的配置信息

动态运行库必须放在应用程序相同的目录中,或系统特定的目录列表中。

猜你喜欢

转载自blog.csdn.net/qq_27931977/article/details/82985316
今日推荐