静态链接库
对于静态链接库是函数库的情况如下:
生成静态链接库:
必须要有头文件。
对于静态链接库是函数库的情况如下:
.h文件中是函数的声明,.cpp文件中是函数的实现。
举例:
测试静态链接库
(1) #include “.h” //编译时候需要 注意:如果.h文件不在源程序文件同级目录下,需要配置VS环境:项目属性---配置属性---C/C++---常规---附加包含目录,可以事先将.h文件放到某个位置的lnclude文件夹中,当添加附加包含目录时候将其定位到该lnclude文件夹。
(2) #pragma comment(lib,"*.lib") 或者配置VS环境方式引入库文件.lib,具体项目属性---配置属性---链接器---输入---附加依赖项 //链接时候需要 注意:如果.lib库文件不在源程序文件同级目录下,需要配置VS环境:项目属性---配置属性---链接器---常规---附加库目录,可以事先将.lib文件放到某个位置的lib文件夹中,当添加附加库目录时候将其定位到该lib文件夹。
举例:
对于动态链接库是函数库的情况如下:
动态链接库
生成动态链接库:
头文件可以不要。但一般第三方都会有头文件,因为如果没有头文件,则需要在实现文件中使用函数之前声明函数,而一般对于用户来讲都是不知道函数声明的,而且对于一个工程中使用多个导出函数的情况还需要多个函数的声明比较麻烦,所以实际中还是都有头文件的。
头文件是函数的声明,声明前需要修饰符_declspec(dllexport) 或者extern 也行,如果动态库是用C语言写的,就需要写成 externa “C”的方式。(说明:
实际上,当你想导入一个符号时,你不需要用到
__declspec(dllimport). 用extern就可以了。但是,如果用__declspec(dllimport) 的话,编译器会生成更有效率的代码。)
实现文件函数前就不再需要修饰符_declspec(dllexport) 等了。
测试动态链接库
对于提供头文件的情况:
#include ".h" //路径问题同静态链接库头文件引入 编译时候需要
#pragma comment(lib,"*.lib") //路径问题同静态链接库库引入,实际对于动态链接库来讲,此时的.lib文件是导入库。 链接时候需要
不提供头文件的情况:
不需要写#include ".h" ,因为没有。此时要完成函数声明功能,需要使用extern int add(int x,int y);来实现函数的声明或者 _declspec(dllimport) int add(int x,int y)来声明引入的函数。
#pragma comment(lib,"*.lib") //路径问题同静态链接库库引入,实际对于动态链接库来讲,此时的.lib文件是导入库。 链接时候需要。
一般动态链接库的标准写法如下:
注意:引入动态库的导入库时候#pragma comment(lib,"*.lib") 的功能等同于在项目上右键直接找到*.lib文件,添加进来是一样的。
比如自己工作VSS中的BMC_DevInterface.lib就是右键添加进来的,并没有使用#pragma comment(lib,"*.lib") 。
右键添加进来的缺点是:如果工程配置文件丢失等,会造成找不到*.lib而无法链接的情况。使用#pragma comment(lib,"*.lib") 是比较好的方法,可移植性比较好。