静态库
使用功能但是不提供源码的方式一:提供头文件和obj文件
obj文件的使用方式:
1) 直接拖到VS工程
2) 在 链接器->输入->附加依赖项 中添加
使用obj,同时兼容c和c++的做法
#ifdef __cplusplus
extern "C" {
#endif
int Add(int n1, int n2);
#ifdef __cplusplus
}
#endif
静态库:
使用方式 – 除了obj的两种方式外,还可以通过代码#pragma comment(lib, “mylib.lib”)
静态库缺点:
1) 如果lib有更新,使用的工程如需应用更新,则必须重新编译
2) 磁盘冗余
3) 其他语言无法使用动态库(dll,so) 导出函数
动态库
动态库使用:
1) 拷贝头文件
2) 拷贝lib
3) 拷贝dll
头文件兼容导入和导出的方式:
#ifdef MYDLL_EXPORT
#define MYDLLAPI __declspec(dllexport)
#else
#define MYDLLAPI __declspec(dllimport)
#endif
1.“动态库”通常是在Windows下的说法,Linux下通常有另外一个名称“共享库”。
2.静态库、动态库不仅可以作用于类,也可以作用于函数。本质上应该是“仅”作用于函数,作用于类时,实际上是作用于类的成员函数。
隐式加载
首先创建一个工程,命名为 cDemo,添加源文件 main.c,内容如下:
#include<stdio.h>
_declspec(dllimport) int add(int, int);
_declspec(dllimport) int sub(int, int);
int main(){
int a=10, b=5;
printf("a+b=%d\n", add(a, b));
printf("a-b=%d\n", sub(a, b));
return 0;
}
找到上节创建的 dllDemo 工程,将 debug 目录下的 dllDemo.lib 和 dllDemo.dll 复制到当前工程目录下。
.lib 文件包含DLL导出的函数和变量的符号名,只是用来为链接程序提供必要的信息,以便在链接时找到函数或变量的入口地址;.dll 文件才包含实际的函数和数据。所以首先需要将 dllDemo.lib 引入到当前项目。
在源码中引入 .lib 文件,如下所示:
#pragma comment(lib, "dllDemo.lib")
显示加载
LoadLibrary
GetProcAddress
FreeLibrary
HMODULE hMod = LoadLibrary("mydll.dll");
if (hMod == NULL)
{
std::cout << "mydll 加载失败" << std::endl;
return 0;
}