lib 和 dll 的区别与使用, 没有头文件改如何使用

1.生成lib文件

首先,我们先建立一个控制台工程(新建->工程->控制台程序),添加add.cpp以及add.h文件。

//sub.h
#ifndef _SUB_H
#define _SUB_H
void sub(int a,int b);
#endif

//sub.cpp
#include "sub.h"
#include <iostream>

void sub(int a,int b)
{
    std::cout<<(a-b)<<std::endl;
}
由于在工程中,没有main()函数,所以直接编译出错。这时,要右键点击工程,并选择工程属性,出现下图,选择静态链接库即可。

这时候再按F7,build solution即可产生lib文件。在Debug中只生成.lib文件。


2.生成dll文件

生成dll文件的过程与上面的过程是一样的,只是在选择Dynamic Library(.dll)即可。在Debug中会生成一个.lib和.dll两种文件。


3.两种文件的使用

  在使用时,静态链接库只要把.h和.lib文件加入到工程文件夹中即可。而动态链接库要把.h、.lib和.dll文件加入到工程中。

#include <iostream>
#include "sub.h"  //链接库的头文件
using namespaces std;

#pragma comment(lib,"sub.lib") //加入链接库

int main()
{
    sub(5,4);
    return 0;
}

4.仅有.dll文件时候的使用方法

  在没有.h和.lib文件时,需要函数指针和WIN32 API函数LoadLibrary、GetProcAddress装载,只需要.dll文件即可(将.dll文件置入工程目录中)。

#include <iostream>
#include <windows.h>               //使用函数和某些特殊变量
typedef void (*DLLFunc)(int,int);  //确定调用函数的形参
int main()
{
    DLLFunc dllFunc;
    HINSTANCE hInstLibrary = LoadLibrary("sub.dll");//加载.dll

    if (hInstLibrary == NULL)
    {
        FreeLibrary(hInstLibrary);
    }
    dllFunc = (DLLFunc)GetProcAddress(hInstLibrary, "sub");//第二个参数为要调用的函数名称
    if (dllFunc == NULL)
    {
        FreeLibrary(hInstLibrary);
    }
    dllFunc(5,4);
    FreeLibrary(hInstLibrary);
    return(1);
}

   最近一直在搞API这东西,用了curl、tinyxml和jsoncpp几种开源的库,在Linux下使用倒是很方便,在windows下还是自己编译的遇到了点问题,从新整理学习下,备用~~

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏专注 Java 基础分享

Java EE基础之JSP(三)

     原来准备简单点,用一篇文章介绍完JSP的,没想到细节很多。这是第三篇也是最后一篇,这三篇文章介绍了基本的JSP知识,很多名词概念和用法,一定要在实践项...

1816
来自专栏抠抠空间

rest_framework组件

1150
来自专栏星汉技术

Storm介绍及原理

5078
来自专栏北京马哥教育

深入浅出:Linux设备驱动之异步通知和异步I/O

在设备驱动中使用异步通知可以使得对设备的访问可进行时,由驱动主动通知应用程序进行访问。因此,使用无阻塞I/O的应用程序无需轮询设备是否可访问,而阻塞访问也可以...

2706
来自专栏developerHaoz 的安卓之旅

Android 一起来看看 7.0 的新特性 FileProvider

对于 Android 7.0,提供了非常多的变化,不过和我们开发者关联最大的,或者说必须要适配的就是去除项目中传递 file:// 类似格式的 Uri 了。

984
来自专栏写写代码吃吃瓜

Android开发中运用okhttp发送网络请求

1464
来自专栏Python

Flask-配置与调试

配置管理 复杂的项目需要配置各种环境。如果设置项很少,可以直接硬编码进来,比如下面的方式: app = Flask(__name__) app.config['...

2726
来自专栏技术之路

设计模式:适配器模式

今天说一下适配器模式:将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间 感觉这是一个很好理解的模式,也是我们很常见的一个模式,...

17010
来自专栏IT技术精选文摘

MySQL的索引是什么?怎么优化?

814
来自专栏前端杂货铺

巧妙复制一个流

实际业务中可能出现重复消费一个可读流的情况,比如在前置过滤器解析请求体,拿到body进行相关权限及身份认证;认证通过后框架或者后置过滤器再次解析请求体传递给业务...

733

扫码关注云+社区