浅谈.lib .dll .obj 关系&& .a .so .o关系
一、.obj .exe .dll .lib
(1).obj
- 目标文件,相当于源代码对应的二进制文件。
- obj文件就是用.c .cpp .h文件经过编译器编译之后生成的目标文件。
(2).exe
- 将程序运行所需要的全部.obj文件连接起来,即形成.exe文件。
- 也就是windows下的可执行文件。
- obj只给出了程序的相对地址,而EXE是绝对地址
(3).dll
- .dll是可提供给多个程序同时使用的可执行代码和数据(资源 )的库
- 可简单理解为封装好的.cpp,里面装的是函数的具体实现
- .dll是动态编译出来的程序运行时所需要的库,没有.dll文件,动态编译的程序就不能运行
(4).lib
- .lib是编译程序时所需的,非运行时所需
- .lib分为静态和动态
- 静态.lib包括了方法及其具体实现。
- 动态.lib只有方法的声明,相当于一个h文件,是对实现部分(.dll文件)的导出部分的声明。
- 利用静态lib编译出来的程序,运行时不需要.dll文件的支持。
- 利用动态lib编译出来的程序,运行时需要.dll文件提供方法的具体实现
- 实际上:.lib文件可看做是若干个.obj文件的集合
(5)一个C/C++工程需要用到其他.c .h .cpp类库、函数库时,其包含的方式有如下图的几种方式
- 1、最直接的方式就是将该类库的.h .cpp 直接引入到工程中,直接完全编译
- 2、另外的方法是先将该类库生成为一个静态的lib库,引入工程时只需包含.h以及.lib文件,编译时将所需的方法具体实现从.lib中提取到可执行文件,可执行文件可不需要其他东西的支持就可直接运行
- 3、常用的方法是将该类库生成一个动态的lib库,还有与之对应的.dll文件,引入工程时也只需包含.h以及.lib文件,但这个动态的.lib文件仅仅提供方法的声明,具体的实现被打包在.dll文件中,因此运行生成的可执行文件需要.dll文件的支持