C_动态库|静态库
动态库
动态链接库简称DLL,同时以.dll 为后缀,主要用于提供代码和数据
dll 并不是所有数据都能被访问到,必须要进行导出
动态链接库在内存中始终只保存了一份数据,起到了节约内存的作用
生成动态链接库的时候会附带一个 lib,这个lib叫做导入库
导入库同于提供导出函数和数据在 dll 中所处的位置,不提供代码
如果使用隐式链接的方式使用动态链接库,必须要 dll 文件
动态链接库的创建
//老师演示的时候是生成两个文件。一个header.h。一个.cpp。
//自己复习的时候,创建完生成了4个文件:header.h targetver.h dllmain.cpp 动态库2.cpp方法一:声明导出
1.创建动态库文件
2.写文件信息
3.运行。
DLL 程序的入口函数(了解),可写可不写的函数
(写在dllmain.cpp,函数定义也写在这)
// DLL 程序的入口函数,会在不同的情况下被调用
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}函数的导出方式:使用声明进行导出
(写在header.h)
DLL 导出的函数不应该有名称粉碎,所以需要使用 extern "C" 取消名称粉碎
#ifdef _USRDLL
// 如果是 dll 表示我需要声明导出函数
#define DLLAPI extern "C" _declspec(dllexport)
#else
// 如果是普通文件需要声明使用的是导入到当前程序的函数
#define DLLAPI extern "C"_declspec(dllimport)
#endif
// 声明函数
DLLAPI void show1();
DLLAPI void show2();
DLLAPI void show3();方法二函数的导出方式:使用模块定义问文件进行导出
1.创建动态库文件
2.写文件
3.设置模板定义
4.运行
(写在header.h)
// 声明函数
void show1();
void show2();
void show3();
//直接声明函数,相比方法一,不需要DLLAPI宏定义声明来粉碎名称。新建一个文件,后缀名改def。名称随意。内容如下。
模块定义文件自己会取消名称粉碎,推荐使用
EXPORTS
show1 @ 1
show2 @ 2
show3 @ 3动态链接库的使用方式
显示的使用动态链接库
// 2. 显示连接,依赖于一组API
HMODULE hModule = LoadLibrary(L"../Debug/04. 动态库和静态库.dll");
// 2.1 如果返回值非 0, 就获取函数
if (hModule) fun = (pfun)GetProcAddress(hModule, "show1");
// 2.2 如果函数非空,就调用函数
if (fun) fun();隐式链接使用动态连接库
// 1. 使用隐式链接的方式调用导出函数
#include "../04. 动态库和静态库/framework.h"
////需要把生成的头文件拷贝到该文件下才能包含成功/////
#pragma comment(lib, "../Debug/04. 动态库和静态库.lib")
////生成的动态lib文件,可以不在该文件目录下////
// 1.1 调用隐式链接的函数
show1();
// 包含头文件是为了获取函数的声明
#### 静态库
- 静态库的创建
- 静态库会生成一个 lib 文件,提供了所有的代码,又叫做**对象库**
- (此处截图用的跟上面动态同一个文件,只是更改了生成方式)
#### 静态链接库和动态链接库的区别
- 使用 dll 的程序必须自带 dll,使用 lib 的程序可以不带 lib
- 使用 dll 的程序通常比较小,使用 lib 的程序通常比较大
- 使用 lib 的程序可以进行跨平台
- 静态链接库的 lib 和 的动态链接库的 lib 不同,分别是对象库和导入库
11
C_动态库|静态库的更多相关文章
- Linux 下动态库 / 静态库(依赖)
一. 依赖动态库的动态库 libfun.so依赖动态库libtest.so(libfun.so动态库里的函数intnothing()调用了libtest.so里的intmytest()函数),而mai ...
- C++基础知识之动态库静态库
一. 静态库与动态库 库(library),一般是一种可执行的二进制格式,被操作系统载入内存执行. 我们通常把一些公用函数制作成函数库,供其它程序使用.函数库分为静态库和动态库 静态库和动态库区别: ...
- linux 动态库 静态库 函数覆盖
本文讨论了linux动态库 静态库中函数的覆盖问题. 测试目的: 同名函数,分别打成动态库libdync_lib.so与静态库libstatic_lib.a,并把libstatic_lib.a打到另 ...
- Linux 动态库 静态库
什么是库 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于windows和Linux的本质不同,因此二者库的二进制是不兼容的.Linux操作系统支持的库函数分为静态库和动态库 ...
- CMake 添加头文件目录,链接动态、静态库(添加子文件夹)
CMake支持大写.小写.混合大小写的命令. 当编译一个需要第三方库的项目时,需要知道: 去哪找头文件(.h),-I(GCC) INCLUDE_DIRECTORIES() 去哪找库文件(.so/.dl ...
- c/c++:动态库 静态库 linux/windows 例子 (转)
作者:吴秦出处:http://www.cnblogs.com/skynet/本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名吴秦(包含链接). C++静 ...
- cmake 添加头文件目录,链接动态、静态库(转载)
来源网址:http://www.cnblogs.com/binbinjx/p/5626916.html 罗列一下cmake常用的命令. CMake支持大写.小写.混合大小写的命令. 1. 添加头文件目 ...
- Qt动态库静态库的创建、使用、多级库依赖、动态库改成静态库等详细说明
本文描述的是windows系统下,通过qtcreator在pro文件中添加动态库与静态库的方法: 1.添加动态库(直接添加动态库文件.dll,非子项目) 通过qtcreator创建动态库的方法就不在此 ...
- golang 编译或链接 c语言动态、静态库的方法, golang 与 c语言 相互调用
1.golang链接c静态库的方法可以见这个示例: https://github.com/atercattus/go-static-link-example https://github.com/sh ...
随机推荐
- Velocity高速新手教程
变量 (1)变量的定义: #set($name = "hello") 说明:velocity中变量是弱类型的. 当使用#set 指令时,括在双引號中的字面字符串将解析和又 ...
- swift 笔记 (二十一) —— 高级运算符
高级运算符 位运算符 按位取反: ~ 按位与运算: & 按位或运算: | 按位异或运算: ^ 按位左移运算: << 按位右移动算: >> 溢出运算符 自从swif ...
- 在java程序中,对于数据的输入/输出操作以“流”(stream)方式进行
在java程序中,对于数据的输入/输出操作以“流”(stream)方式进行
- 浏览器对MP4视频 帧宽度 高度的兼容性
传入oss后 或者 本地 拖动到 浏览器 谷歌 都不能播放 Edge 可以播放 但 Edge不支持 本地拖入 播放 搜狗浏览器 同谷歌
- Binary safe
https://en.wikipedia.org/wiki/Binary-safe A binary-safe function is one that treats its input as a r ...
- 4.7.3 Canonical LR(1) Parsing Tables
4.7.3 Canonical LR(1) Parsing Tables We now give the rules for constructing the LR(1) ACTION and GOT ...
- bzoj 4883 棋盘上的守卫 —— 基环树转化
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4883 首先,注意到每个点可横可竖,但花费一样: 所以考虑行列的交集,那么这个条件可以转化为行 ...
- bzoj2763 [JLOI2011]飞行路线——分层图
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2763 构建分层图. 代码如下: 写法1(空间略大)(时间很慢): #include<i ...
- java笔记线程方式1优先级
* 我们的线程没有设置优先级,肯定有默认优先级. * 那么,默认优先级是多少呢? * 如何获取线程对象的优先级? * public final int getPriority():返回线程对象的优 ...
- Rails5 Model Document
创建: 2017/06/09 更新: 2017/06/21 更新: 2017/06/23 对待未完成的追加# TODO: 更新: 2017/06/29 修正文件名db/seed.rb ---> ...