【C++】DLL和LIB的含义及使用场景和区别

DLL 和 LIB 是 C/C++ 程序开发中常用的两种文件类型,它们的作用和用途存在较大区别。
1. 什么是 DLL 和 LIB?
DLL(Dynamic Link Library)动态链接库
DLL 文件是动态链接库,扩展名为 .dll,用于在程序运行时动态加载和调用其中的代码或函数。
特点:
在运行时加载,按需使用,节省内存和磁盘空间
可以被多个程序共享,减少代码冗余。
更容易更新和维护,因为 DLL 文件可以单独更改而无需重新编译主程序
LIB(Library)静态库或导入库
LIB 文件有两种形式:

静态库:包含具体的实现代码,编译时直接链接到可执行文件中。
导入库:用于支持动态链接库(DLL)的引用,它仅存储 DLL 的函数导出信息,而不包含实际代码实现。
特点:

静态库会在编译时直接嵌入到程序中,因此生成的可执行文件较大,但独立性强,不依赖外部文件。
导入库提供对 DLL 的引用,支持程序动态调用 DLL 文件中的函数。

3. DLL 与 LIB 的关联

  1. 如果使用 DLL 文件,编译时需要一个 LIB 文件作为导入库。
  2. 导入库(LIB) 只是提供 DLL 的符号表和地址映射,不包含实际实现代码。
  3. 程序运行时会根据 LIB 文件中的信息动态加载相应的 DLL 文件。

4. 示例代码分析

动态链接库 (DLL)

// mylibrary.cpp
#include <iostream>
extern "C" __declspec(dllexport) void HelloWorld() {
    std::cout << "Hello, World from DLL!" << std::endl;
}

编译生成 DLL 和导入库:

cl /LD mylibrary.cpp /Fe:mylibrary.dll
  • 生成:mylibrary.dll 和 mylibrary.lib(导入库)。

应用程序调用 DLL:

// main.cpp
#include <Windows.h>
#include <iostream>
typedef void(*HelloFunc)();

int main() {
    HMODULE hModule = LoadLibrary("mylibrary.dll");
    if (hModule) {
        HelloFunc HelloWorld = (HelloFunc)GetProcAddress(hModule, "HelloWorld");
        if (HelloWorld) {
            HelloWorld();
        }
        FreeLibrary(hModule);
    } else {
        std::cout << "Failed to load DLL!" << std::endl;
    }
    return 0;
}

 静态库 (LIB)

// mylibrary.cpp
#include <iostream>
void HelloWorld() {
    std::cout << "Hello, World from LIB!" << std::endl;
}

编译生成静态库:

cl /c mylibrary.cpp
lib mylibrary.obj /OUT:mylibrary.lib

应用程序调用静态库:

// main.cpp
#include <iostream>
extern void HelloWorld();

int main() {
    HelloWorld();
    return 0;
}
  • 链接静态库:
cl main.cpp mylibrary.lib

5. 使用场景
DLL 使用场景:
插件或模块化设计:如浏览器插件、游戏扩展模块等,DLL 允许程序按需加载模块。
共享库和资源:多个程序共享同一个库,减少内存占用和重复代码。
更新和维护方便:更新 DLL 而无需重新编译主程序。
LIB 使用场景:
独立应用程序:不需要依赖外部文件,适合嵌入式系统或无需动态加载的程序。
运行速度要求高:静态库直接嵌入程序中,无需动态加载,适合性能要求高的应用。
部署简单:只需分发一个可执行文件,无需额外的 DLL 文件。
6. 小结
DLL(动态链接库) 适合模块化、插件式开发和共享资源,更新维护方便,但依赖运行时环境。
LIB(静态库或导入库) 适合独立应用,无需运行时依赖,但更新时需要重新编译整个程序。
如果程序需要频繁更新或模块化设计,建议使用 DLL;如果需要高性能、无外部依赖,则使用 LIB。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.youkuaiyun.com/weixin_44939430/article/details/144670981

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值