VC动态库可以嵌套调用
在VC中,依赖库分为静态库(.lib)和动态库(.dll)两种。如果使用的是静态库,会把依赖的静态库中的内容编译到目标文件中。如果是使用的是动态库,则根据引用方式进行编译。
动态库分为两部分:动态库静态链接(A.lib) 动态库(A.dll)。
动态库编译只需要在代码中包含动态库的头文件即可。
①动态库静态调用----隐式链接。
有两种方式 引用。
方式一:在工程属性中配置。
项目->属性->链接 设置附加库目录和“输入”选项中设置静态库链接(A.lib)
方式二:在代码中直接声明使用动态库链接。
项目->属性->链接 设置附加库目录
代码中添加
#pragma comment(lib, "A.lib")
链接器可以根据A.lib找到A.dll中相应的实现。
②动态库动态调用----显式链接。
通过Windows API LoadLiberary,通过GetProcAddress获取函数地址,然后调用。
这种方式不需要使用静态库链接(A.lib)
运行时需要将DLL和可执行文件放在同一目录。
二、VC动态库嵌套调用
VC动态库可以嵌套调用,当然最好是不进行嵌套调用。为了防止头文件嵌套包含,应该定义 #pragma once
例如:
动态库A的头文件 libA.h 定义:
#pragma once
#ifdef LIBA_EXPORTS
#define LIBA_API __declspec(dllexport)
#else
#define LIBA_API __declspec(dllimport)
#endif
#define PI_VALUE 3.1415926f
// 此类是从 libA.dll 导出的
class LIBA_API ClibA {
public:
ClibA(void);
// 计算圆锥体体积。
float TaperV(int r, int h);
//圆面积
float AreaCircle(int r);
};
extern LIBA_API int nlibA;
LIBA_API int fnlibA(void);
#ifndef LIBA_EXPORTS
# pragma comment(lib, "libA.lib")
#endif
//===========================
动态库libB 的头文件 libB.h的定义如下:
#pragma once
#ifdef LIBB_EXPORTS
#define LIBB_API __declspec(dllexport)
#else
#define LIBB_API __declspec(dllimport)
#endif
// 此类是从 libB.dll 导出的
class LIBB_API ClibB {
public:
ClibB(void);
// 圆柱体体积。
int ClinderV(int r, int h);
};
extern LIBB_API int nlibB;
LIBB_API int fnlibB(void);
#ifndef LIBB_EXPORTS
# pragma comment(lib, "libB.lib")
#endif
//==========================
libA.cpp
#include "stdafx.h"
#include "libA.h"
#include "libB.h"
// 这是导出变量的一个示例
LIBA_API int nlibA=0;
// 这是导出函数的一个示例。
LIBA_API int fnlibA(void)
{
return 42;
}
// 这是已导出类的构造函数。
// 有关类定义的信息,请参阅 libA.h
ClibA::ClibA()
{
return;
}
float ClibA::TaperV( int r, int h )
{
ClibB clibb;
return (float)clibb.ClinderV(r, h) / 3;
}
float ClibA::AreaCircle( int r )
{
return PI_VALUE * r * r;
}
成员函数TaperV需要调用libB的成员函数。
//==============================
libB.cpp
#include "stdafx.h"
#include "libB.h"
#include "libA.h"
// 这是导出变量的一个示例
LIBB_API int nlibB=0;
// 这是导出函数的一个示例。
LIBB_API int fnlibB(void)
{
return 42;
}
// 这是已导出类的构造函数。
// 有关类定义的信息,请参阅 libB.h
ClibB::ClibB()
{
return;
}
int ClibB::ClinderV( int r, int h )
{
ClibA cliba;
return cliba.AreaCircle(r) * h;
}
成员函数ClinderV需要调用libA的成员函数。
VC动态库相互嵌套并不会引起问题,但是最好不适用嵌套调用的方式。
首先理解了三个概念:
1. 静态链接库
这是一个名词,是.lib库。
2. 静态链接
在工程设置的Link项中,添加所要链接的.lib库,程序中包含其导出函数对应的头文件。再编译时,就会将使用到的静态库中的函数一同编译到目标文件中,目标文件可以是lib库,dll,exe,ocx等。
3. 动态链接
程序再运行时才装载要使用的函数。动态链接一般都是使用Dll——动态链接库。
一直都是使用动态库,经常是动态库链接一个静态库。最近想使用静态库链接一个静态库,可能要好几层,同事们都说不可以,可我觉得理论上没有问题,于是就试验了一下,事实证明是完全可以的。
1. 在VC6.0上,lib库的工程设置中,是没有追加静态库的地方的,只能再程序中使用语句#pragma comment(lib, "***.lib")来追加。
2. 在VS2005上,我使用的是VS2005,它的工程设置中,依然可以追加依赖的静态库。
在使用方式上没有什么特殊之处。
VC动态库可以嵌套调用相关推荐
- VC++动态库封装及调用
https://blog.csdn.net/zhangfuliang123/article/details/71515796 一直对动态库的封装理解不是很透彻,虽然之前写过一个Demo,不过并没有真正 ...
- (成功案例超详细保姆级)vs2019 opencv qt创建动态库被C#调用
之前有个项目关于图像处理,既用到了opencv,还二次开发了相机提供的动态库.一开始我是用QT写的,然后发现人家只需要我提供一个库函数调用就可以了,但是他是用C#写的.没办法,到处找资料,但是没有找到 ...
- 成功案例超详细-vs2019 opencv qt创建动态库被C#调用
之前有个项目关于图像处理,既用到了opencv,还二次开发了相机提供的动态库.一开始我是用QT写的,然后发现人家只需要我提供一个库函数调用就可以了,但是他是用C#写的.没办法,到处找资料,但是没有找到 ...
- CUDA动态库封装以及调用
CUDA动态库封装以及调用 参考:http://blog.sina.com.cn/s/blog_618941f701016d26.html 通过将CUDA相关计算操作放在库中,方便在项目中调用,省去了 ...
- Linux 动态库的显示调用
Linux 动态库的显示调用 分类: 动态库与静态库 2012-03-17 23:56 1710人阅读 评论(0) 收藏 举报 linuxnulllibrary测试web服务apache 10.动态库 ...
- Linux静态库和动态库创建与调用
Linux静态库和动态库创建与调用 1. 静态函数库 2. 动态函数库 第1步:编辑得到举例的程序--hello.h.hello.c和main.c: 第2步:将hello.c编译成.o文件: gcc ...
- C++动态库封装及调用
一直对动态库的封装理解不是很透彻,虽然之前写过一个Demo,不过并没有真正的理解.所以写下来,帮助自己理解下. 1.一个程序从源文件编译生成可执行文件的步骤: 预编译 --> 编译 --> ...
- c++ 类文件的动态库生成及调用例子
https://blog.csdn.net/josiechen/article/details/70174445 首先,创建一个简单的类,类头文件的名称与项目工程的名称应该一致, 控制台项目工程名:t ...
- Linux链接库三(C跟C++之间动态库的相互调用)
http://www.cppblog.com/wolf/articles/74928.html http://www.cppblog.com/wolf/articles/77828.html http ...
- Java调用动态库 缺点,Java调用动态库所需要关心的有关问题
Java调用动态库所需要关心的问题 标签: 无标签 利用JNative实现Java调用动态库(转) http://cctv663.blog.163.com/blog/static/1011921220 ...
最新文章
- 希望增加的BLOG功能(序)
- 《Nmap渗透测试指南》—第1章1.2节Windows下安装Nmap
- Python中字典对象实现原理
- (Head First 设计模式)学习笔记(1)
- cookie无法读取bdstoken_第二章(第12节):cookie操作
- Eclipse关闭XML文件验证的方法
- 6-Spring Boot缓存管理
- Android 开发中常见的Eclipse排版设置
- 简化版shell远程登录脚本
- 电脑主板原理图讲解(电脑主板构造图文详解)CPU和北桥芯片(随着发展有的北桥已经被设计到CPU内部了)南桥芯片
- 2021春招美团算法笔试题
- 为什么很多公司不要培训出来的Java程序员?
- VPS好用吗?VPS和物理机怎么选择?
- pdf 转 高清图片
- “将就的人生,其实沉没成本非常高”
- 阴阳师夜影诡谈第二天阵容怎么配
- 【文献阅读2】Cytological and transcriptome analyses reveal abrupt gene expression for meiosis and sacchari
- 调用百度ai接口实现图片文字识别详解
- 【happyz】MATLAB-FM仿真01
- 学习如何做个有钱人 你也有机会赚上1000万