|
|
@@ -1,91 +1,112 @@ |
|
|
|
# 库相关知识点 |
|
|
|
|
|
|
|
## 静态库 |
|
|
|
- 静态库的基本概念 |
|
|
|
|
|
|
|
静态库是指在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”文件;在链接步骤中,连接器将从库文件取得 |
|
|
|
所需的代码 ,复制到生成的可执行文件中的这种库。 |
|
|
|
|
|
|
|
- 静态库的生成 |
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
- 静态库的调用 |
|
|
|
|
|
|
|
- 在工程配置中调用 |
|
|
|
|
|
|
|
- 1.头文件的引用 |
|
|
|
|
|
|
|
方案一:设置头文件目录 |
|
|
|
|
|
|
|
将头文件复制到我们的工程文件中。 |
|
|
|
|
|
|
|
方案二: |
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
2. 库文件的引用 |
|
|
|
|
|
|
|
方案一:连接器设置库文件目录 |
|
|
|
|
|
|
|
方案二: |
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
将lib添加到资源文件中 |
|
|
|
|
|
|
|
- 在代码中语句加载lib调用 |
|
|
|
|
|
|
|
使用`#pragma comment(lib, "creat_static_lib.lib")`指令 |
|
|
|
|
|
|
|
### 静态库的基本概念 |
|
|
|
|
|
|
|
静态库是指在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”文件;在链接步骤中,连接器将从库文件取得 |
|
|
|
所需的代码 ,复制到生成的可执行文件中的这种库。在程序编译时会被整合到最终的可执行文件中,这意味着编译后的程序可以独立运行,无需外部库。 |
|
|
|
|
|
|
|
#### 静态库的优点 |
|
|
|
|
|
|
|
加载速度快,因为库的代码已经被包含在程序中,以及发布程序时无需提供静态库文件,便于移植。 |
|
|
|
|
|
|
|
#### 静态库的缺点 |
|
|
|
|
|
|
|
相同的库文件可能在内存中被加载多次,消耗系统资源;此外,每当库文件更新时,都需要重新编译整个项目以生成新的可执行文件,这会浪费时间。 |
|
|
|
|
|
|
|
#### 静态库的生成 |
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
#### 静态库的调用 |
|
|
|
|
|
|
|
- 在工程配置中调用 |
|
|
|
|
|
|
|
1. 头文件的引用 |
|
|
|
|
|
|
|
方案一:设置头文件目录 |
|
|
|
|
|
|
|
将头文件复制到我们的工程文件中。 |
|
|
|
|
|
|
|
方案二: |
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
2. 库文件的引用 |
|
|
|
|
|
|
|
方案一:连接器设置库文件目录 |
|
|
|
|
|
|
|
方案二: |
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
将lib添加到资源文件中 |
|
|
|
|
|
|
|
- 在代码中语句加载lib调用 |
|
|
|
|
|
|
|
使用`#pragma comment(lib, "creat_static_lib.lib")`指令 |
|
|
|
|
|
|
|
## 动态库 |
|
|
|
- 动态库的基本概念 |
|
|
|
|
|
|
|
动态库是一种在程序运行时才被加载的库文件,它包含了函数和数据,可以被多个程序共享。 |
|
|
|
|
|
|
|
- 动态库的生成 |
|
|
|
|
|
|
|
- 通过导出语句生成 |
|
|
|
|
|
|
|
1. 先宏定义MATHLIBRARY_EXPORTS |
|
|
|
|
|
|
|
2. 写导出语句 |
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
3. .C文件正常编写需要封装函数的逻辑 |
|
|
|
|
|
|
|
- 通过模块文件生成 |
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
- 动态库的调用 |
|
|
|
在工程配置中调用 |
|
|
|
|
|
|
|
导入头文件,引用 |
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
~~在代码中语句加载lib调用~~ |
|
|
|
|
|
|
|
`#pragma comment(lib, "creat_static_lib.lib")` |
|
|
|
|
|
|
|
在代码中语句加载`dll`调用 |
|
|
|
|
|
|
|
将`dll`文件复制到`dbug`下面,使用以下程序指令动态加载 |
|
|
|
|
|
|
|
HINSTANCE Dll = LoadLibrary(L"test.dll"); |
|
|
|
if (Dll == NULL) { |
|
|
|
std::cerr << "无法加载DLL! 错误码: " << GetLastError() << std::endl; |
|
|
|
return 1; |
|
|
|
} |
|
|
|
typedef void (*Func)(); // 定义函数指针类型 |
|
|
|
Func add = (Func)GetProcAddress(Dll, "fun1"); |
|
|
|
add(); |
|
|
|
FreeLibrary(Dll); |
|
|
|
return 0; |
|
|
|
#### 动态库的基本概念 |
|
|
|
|
|
|
|
动态库是一种在程序运行时才被加载的库文件,它包含了函数和数据,可以被多个程序共享。 |
|
|
|
|
|
|
|
#### 动态库的优点 |
|
|
|
|
|
|
|
可以实现不同进程间的资源共享,升级简单,只需替换库文件而无需重新编译应用程序,以及可以控制库的加载时机,不调用库函数时库不会被加载。 |
|
|
|
|
|
|
|
#### 动态库的缺点 |
|
|
|
|
|
|
|
其加载速度比静态库慢,且发布程序时需要提供依赖的动态库文件。 |
|
|
|
|
|
|
|
#### 动态库的生成 |
|
|
|
|
|
|
|
- 通过导出语句生成 |
|
|
|
|
|
|
|
1. 先宏定义MATHLIBRARY_EXPORTS |
|
|
|
|
|
|
|
2. 写导出语句 |
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
3. .C文件正常编写需要封装函数的逻辑 |
|
|
|
|
|
|
|
- 通过模块文件生成 |
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
#### 动态库的调用 |
|
|
|
|
|
|
|
在工程配置中调用 |
|
|
|
|
|
|
|
导入头文件,引用 |
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
~~在代码中语句加载lib调用~~ |
|
|
|
|
|
|
|
`#pragma comment(lib, "creat_static_lib.lib")` |
|
|
|
|
|
|
|
在代码中语句加载`dll`调用 |
|
|
|
|
|
|
|
将`dll`文件复制到`dbug`下面,使用以下程序指令动态加载 |
|
|
|
|
|
|
|
``` |
|
|
|
HINSTANCE Dll = LoadLibrary(L"test.dll"); |
|
|
|
if (Dll == NULL) { |
|
|
|
std::cerr << "无法加载DLL! 错误码: " << GetLastError() << std::endl; |
|
|
|
return 1; |
|
|
|
} |
|
|
|
typedef void (*Func)(); // 定义函数指针类型 |
|
|
|
Func add = (Func)GetProcAddress(Dll, "fun1"); |
|
|
|
add(); |
|
|
|
FreeLibrary(Dll); |
|
|
|
return 0; |
|
|
|
``` |