系统中的obj文件、dll文件、so文件、lib文件、exe文件、vcproj文件、sln文件

1. 源代码(.c等)要经过编译器编译得到目标代码(.obj),再经过链接器使目标代码库函数启动代码合并成一个文件,即可执行文件exe在这里插入图片描述

2. 生成可执行文件时的链接过程又可根据链接库(动态链接库和静态链接库)的类型分为两种情况
##静态链接
需要的文件: 头文件 .h 、静态库 .lib、项目文件(src源码)、启动代码
a)使用静态链接库的项目先引用头文件.h(包含函数的声明等)经过编译得到目标代码
b)链接时将静态库**.lib文件**(包含了函数的定义——实体代码、符号表等)全都直接包含在最终生成的exe文件中。 运行最终的exe文件时不再需要lib。

##动态链接
需要的文件: 头文件 .h 、动态链接库的**.lib文件,动态链接库的.dll文件,项目文件(src源码)、启动代码
a)使用静态链接库的项目先
引用头文件.h(包含函数的声明等)经过编译得到目标代码
b)这里的.lib包含
dll文件与其中函数对应位置的信息**,.dll则包含了函数的定义——实体代码、符号表
c)链接时将**.lib文件和动态库.dll文件及目标代码一起生成.exe文件。lib文件给目标代码在dll的解析**提供路径。 但是此时的exe文件中并没有真正的函数实体,要把dll放在和exe同一个目录下,每次运行都需要去dll调用,采用 LoadLibrary-GetProcAddress-FreeLibrary方法进行函数导入。
与静态链接一样,一旦链接完成就不再需要lib文件。

dll文件(windows,又称类库)、so文件(unix)、lib文件、exe文件:都是系统中编译后产生的最终产物。dll库也叫共享库,他的链接机制允许多个工程调用一个dll执行exe文件,而lib则不可以。
lib是编译时需要的dll是运行时需要的。如果要完成源代码的编译,有lib就够了。如果也使动态连接的程序运行起来,有dll就够了 。 dll中其实就是一系列的API接口

obj文件是仅通过编译器编译后的产物,没有和链接器链接;仅仅是源码翻译的机器码,**缺少入口函数(启动代码)**和库函数,无法直接执行。

vcproj文件(工程文件)和sln文件(解决方案文件)可以看做不同级别的包含源代码的目录,其中还包含了部分配置信息。这个文件相当于linux系统中的makefile。cmake就是生成makefile的,VS其实也是一样,VS编译器会对新建的项目自动生成vcproj文件,并且实时更新。而VS的编译,其实就是基于这个类似makefile的vcproj的。一旦修改了.vcproj文件就需要重新build。
vcproj.filter是控制项目在VS中的展示界面的,修改后编译不会重新build。
包含关系:
sln /vcproj /.c
sln /vcproj /.h

解决方案文件sln的生成: 是由工程文件生成的,同时生成的还有exe文件。
动态链接库dll的生成: 2种情况
1.自己创建的项目:解决方案文件(sln) 选一下环境release等, 然后点击生成 ,再点击生成xxxx(U),即生成了dll文件
2.仅有下载的源码:通过cmake先对源码生成cmakelist.txt(相当于makefile和.vcproj,作用:定义源码编译链接的顺序等),然后用VS编译(make)出二进制文件(build)

exe文件与dll文件区别:

1. 类库生成的是dll,控制台console windows程序都是exe的
2.dll里包含了目标代码中要调用的方法,但不可直接执行(跟cpu打交道),只允许被调用;exe是可执行文件(可以直接跟cpu打交道),一般做为程序的执行入口。

Cmake:一种编译过程控制的软件(cuda10,cmake3.9.0+)
1.首先新建一个cmakelist.txt文件,然后编写一个基本设置,如版本及目录包括的源码文件、生成二进制码的目录
2.在工程总目录下新建build目录(这就是二进制码的目录)
3.configure,会生成makefile文件(unix下)或projects/workspaces(windows vsc++下)
4.进入build运行make即可完成编译。

posted @ 2019-10-24 15:31  Parallax  阅读(703)  评论(0编辑  收藏  举报