库(静态库和动态库)

程序运行的四个阶段:预处理,编译,汇编,链接

静态库(lib):在链接阶段,将代码完整的拷贝到可执行程序

动态库(dll):在链接阶段,将引入库(.lib,存储的为函数名和位置)拷贝到可执行程序

一 . 静态库:
以C语言的形式生成库

.h中

extern "C" int add(int ,int);
extern "C" int sub(int ,int);

二. 测试静态库:(将.h和.lib放入)

.h

#ifdef __cplusplus//c++程序员用c的方式打开
extern "C" int add(int ,int);
extern "C" int sub(int ,int);
#else //c的程序员直接打开
int add(int ,int);
int sub(int ,int);
#endif

源.cpp

#include <iostream>
#include "stdafx.h"//声明
using namespace std;

#pragma comment(lib,"静态库.lib")//在链接阶段,导入静态库(方法一)
int main()
{
    cout<<add(3,4)<<endl;
    system("pause");
    return 0;
}

导入静态库(方法二):右键->属性->链接器->输入->静态库.lib

三. 动态库:

两种导出方式:
1. 源文件右键添加新建项 代码 模块定义文件
LIBRARY "动态库.dll"
EXPORTS
add @1
sub @2

2. 在要导出的函数位置前加_declspec(dllexport)

四 . 测试动态库(导入.lib和.dll(.dll要与.exe在同一目录文件下))

 两种加载方式:

1.隐式加载:#pragma comment(lib,"0305动态库.lib")

#include <iostream>
#include "mydll.h"
using namespace std;

//引入库 --隐式加载
#pragma comment(lib,"0305动态库.lib")

int main()
{
    cout<<add(4,6)<<endl;
    system("pause");
    return 0;
}

2.显示加载

#include <iostream>
#include <Windows.h>
using namespace std;

typedef int (*PFUN)(int,int);

int main()
{
    //显示运行时加载
    //1.加载库
    HMODULE  hmodule = LoadLibrary(L"../debug/0305动态库.dll");
    //2.获得库函数的地址
    if(hmodule)
    {
        PFUN pfun = (PFUN)GetProcAddress(hmodule,"add");
        cout<<(*pfun)(2,3)<<endl;
        //3.卸载库
        FreeLibrary(hmodule);
    }
    
    system("pause");
    return 0;
}

更新:

只更新函数实现时,只需将.dll重新复制

更改函数名和导出方式时,需要将.dll和.lib重新复制

原文地址:https://www.cnblogs.com/Lune-Qiu/p/8515462.html