动态链接库之基础概念

静态链接库(需要给用户两个文件lib.h和staticLib.lib)

  • 创建一个静态链接库staticLib,包含一个.h文件和一个.cpp文件
//lib.h
#ifndef LIB_H
#define LIB_H
extern "C" int add(int x,int y);
#endif
//lib.cpp
#include "lib.h"
int add(int x,int y){
    return x+y;
}
  • 创建一个测试项目libTest
#include "stdio.h"
#include "..\lib.h"
#pragma comment(lib,"..\\debug\\staticLib.lib") //指定与静态库一起连接
int main(){
    printf("2+3=%d \n",add(2,3));
    return 0;
}

动态链接库
导出函数

  • DLL内的函数分为两种
  • DLL导出函数:可供应用程序调用
  • DLL内部函数:只能在DLL程序使用,应用程序无法调用他们

DLL中声明导出函数有两种方式

  • 在函数声明中加上__declspec(dllexport)
 #ifndef LIB_H
 #define LIB_H
 extern "C" int __declspec(dllexport)add(int x,int y);
 #endif
  • 采用模块定义(.def).在dllLib中添加lib.def文件
;.def 文件中的注释由每个注释行开始处的分号 (;) 指定,且注释不能 与语句共享一行。
;lib.def:导出DLL程序

;LIBRARY语句说明.def文件相应的DLL
LIBRARY dll

;EXPORTS语句后列出要导出函数的名称。可以在.def文件中的导出函数 名后加@n,表示要导出函数的序号为n(在进行函数调用时,这个序号将发挥 其作用);
EXPORTS
add @ 1
  • DLL调用方式
  • 静态调用
#include "stdio.h"
//将编译 dll工程所生成的.lib和.dll文件拷入dllTest工程所在的路径,dllTest 执行下列代码:
#pragma comment(lib,"dll.lib")
//.lib文件中仅仅是关于其对应DLL文件中函数的重定位信息
extern "C" __declspec(dllimport) add(int x,int y);
int main(int argc, char* argv[])
{
    int result = add(2,3);
    printf("%d\n",result);
    return 0;
}
  • 动态调用
#include <stdio.h>
#include <windows.h>
typedef int(*lpAddFun)(int, int); //定义函数指针类型
int main(int argc, char *argv[])
{
    HINSTANCE hDll; //DLL句柄
    lpAddFun addFun; //函数指针
    hDll = LoadLibrary("..\\Debug\\dll.dll");
    if (hDll != NULL)
    {
        addFun = (lpAddFun)GetProcAddress(hDll, "add");
        if (addFun != NULL)
        {
            int result = addFun(1, 3);
            printf("%d\n", result);
        }
        FreeLibrary(hDll);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值