C++静态库与动态库创建(易操作)
一. 静态库与动态库的区别:
1、 静态库在工程编译的过程中会直接整合到目标程序中,优点在于编译成功的可执行文件可以独立运行,不再需要向外部要求读取函数库的内容。如果函数库更新,需要重新编译。
2、 动态库,动态函数库在编译时,在程序中只有一个“指向”的位置,也就是说编译时,动态库中的函数不会编译到可执行文件中,当可执行文件在执行过程中需要函数库中的函数时,根据编译时遗留的“指向”,找到对应的函数。使用动态库得到的可执行文件不能独立运行。但是对于产品系统更新,只需要重新编译动态库即可。
二. 静态库与动态库的创建
3、 创建静态库lib:
①、使用VS创建空项目
编写头文件以及对应的源文件
②、生成lib文件:
右键项目->属性->配置属性->常规->配置类型->静态库(.lib)
③、生成解决方案:
debug、release
4、创建动态库dll
①、使用VS创建空项目
编写头文件以及对应的源文件,在源文件中添加句柄
头文件:
#ifdef DLLAPI
#ifdef DLLEXPORT_API //类似于if else结构,用于确定
#define JCHEXPORT __declspec(dllexport) //句柄宏的输入、输出属性
#else
#define JCHIMPORT __declspec(dllimport)
#endif
#else
#define JCHEXPORT
#endif // DLLAPI
#include <iostream>
double JCHEXPORT add1(double a, double b);
double JCHEXPORT multi1(double a, double b);
class JCHEXPORT SIFTDetection
{
public:
SIFTDetection() {} //默认构造函数
SIFTDetection(Mat &img) { //带参数构造函数
imgSrc = img.clone();
}
}
对应的cpp文件中添加,或者在属性页的预编译器的指令中添加这两个宏定义
#define DLLAPI
#define DLLEXPORT_API
double add1(double a, double b)
{
return a + b;
}
double multi1(double a, double b)
{
return a + b;
}
②、生成dll和lib文件:
右键项目->属性->配置属性->常规->配置类型->动态库(.dll)
③、生成解决方案:
debug、release
三. NOTE:
①更改输出文件的名称
右键项目->属性->配置属性->常规中配置如下图所示:
到此便可以完成动态库以及静态库的创建
②创建动态库与静态库;可以直接在开始新建项目时,就直接创建动态库或静态库项目。也可以在常规属性中将配置类型更改为动态库(.dll)
③生成的动态库或静态库文件,其中.dll文件的名称不能随意更改、只能通过note①中的方法重新编译名称,但是生成的.lib的文件名称可以随意更改。
④在头文件中,如果有函数的实现,无论有无输出的宏定义,在主函数中都可以使用,因为#include的意思就是把所有的文件直接粘贴到主函数中。若只有函数的声明,而没有函数的实现,只有通过输出宏定义,才能够被主程序中使用。