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动态库可以嵌套调用相关推荐

  1. VC++动态库封装及调用

    https://blog.csdn.net/zhangfuliang123/article/details/71515796 一直对动态库的封装理解不是很透彻,虽然之前写过一个Demo,不过并没有真正 ...

  2. (成功案例超详细保姆级)vs2019 opencv qt创建动态库被C#调用

    之前有个项目关于图像处理,既用到了opencv,还二次开发了相机提供的动态库.一开始我是用QT写的,然后发现人家只需要我提供一个库函数调用就可以了,但是他是用C#写的.没办法,到处找资料,但是没有找到 ...

  3. 成功案例超详细-vs2019 opencv qt创建动态库被C#调用

    之前有个项目关于图像处理,既用到了opencv,还二次开发了相机提供的动态库.一开始我是用QT写的,然后发现人家只需要我提供一个库函数调用就可以了,但是他是用C#写的.没办法,到处找资料,但是没有找到 ...

  4. CUDA动态库封装以及调用

    CUDA动态库封装以及调用 参考:http://blog.sina.com.cn/s/blog_618941f701016d26.html 通过将CUDA相关计算操作放在库中,方便在项目中调用,省去了 ...

  5. Linux 动态库的显示调用

    Linux 动态库的显示调用 分类: 动态库与静态库 2012-03-17 23:56 1710人阅读 评论(0) 收藏 举报 linuxnulllibrary测试web服务apache 10.动态库 ...

  6. Linux静态库和动态库创建与调用

    Linux静态库和动态库创建与调用 1. 静态函数库 2. 动态函数库 第1步:编辑得到举例的程序--hello.h.hello.c和main.c: 第2步:将hello.c编译成.o文件: gcc ...

  7. C++动态库封装及调用

    一直对动态库的封装理解不是很透彻,虽然之前写过一个Demo,不过并没有真正的理解.所以写下来,帮助自己理解下. 1.一个程序从源文件编译生成可执行文件的步骤: 预编译 -->  编译 --> ...

  8. c++ 类文件的动态库生成及调用例子

    https://blog.csdn.net/josiechen/article/details/70174445 首先,创建一个简单的类,类头文件的名称与项目工程的名称应该一致, 控制台项目工程名:t ...

  9. Linux链接库三(C跟C++之间动态库的相互调用)

    http://www.cppblog.com/wolf/articles/74928.html http://www.cppblog.com/wolf/articles/77828.html http ...

  10. Java调用动态库 缺点,Java调用动态库所需要关心的有关问题

    Java调用动态库所需要关心的问题 标签: 无标签 利用JNative实现Java调用动态库(转) http://cctv663.blog.163.com/blog/static/1011921220 ...

最新文章

  1. 希望增加的BLOG功能(序)
  2. 《Nmap渗透测试指南》—第1章1.2节Windows下安装Nmap
  3. Python中字典对象实现原理
  4. (Head First 设计模式)学习笔记(1)
  5. cookie无法读取bdstoken_第二章(第12节):cookie操作
  6. Eclipse关闭XML文件验证的方法
  7. 6-Spring Boot缓存管理
  8. Android 开发中常见的Eclipse排版设置
  9. 简化版shell远程登录脚本
  10. 电脑主板原理图讲解(电脑主板构造图文详解)CPU和北桥芯片(随着发展有的北桥已经被设计到CPU内部了)南桥芯片
  11. 2021春招美团算法笔试题
  12. 为什么很多公司不要培训出来的Java程序员?
  13. VPS好用吗?VPS和物理机怎么选择?
  14. pdf 转 高清图片
  15. “将就的人生,其实沉没成本非常高”
  16. 阴阳师夜影诡谈第二天阵容怎么配
  17. 【文献阅读2】Cytological and transcriptome analyses reveal abrupt gene expression for meiosis and sacchari
  18. 调用百度ai接口实现图片文字识别详解
  19. 【happyz】MATLAB-FM仿真01
  20. 学习如何做个有钱人 你也有机会赚上1000万

热门文章

  1. __index元方法
  2. java实现排序的几种方法
  3. linux 中文件的操作
  4. 武汉大学2014年基础数学面试全过程
  5. shit!Vxworks!Shit!WorkBench!
  6. 用实体类来做数据绑定(不用数据表数据字段的绑定方法)
  7. 设置eclipse中的编辑区的背景颜色、注释文字的颜色、修改注释内作者名和时间...
  8. WEEX|简单界面的实现与页面跳转
  9. 九度OJ题目1000: A + B(数学)
  10. gstream初次尝试