news 2026/4/23 20:42:19

Windows系统下静态库、动态库的制作和使用方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Windows系统下静态库、动态库的制作和使用方法

一、静态库(.lib)

1. 静态库制作

方法一:使用Visual Studio IDE
  1. 创建静态库项目(Win32 Static Library)

  2. 添加源文件(.cpp)和头文件(.h)

  3. 编译生成 .lib 文件

方法二:使用命令行
rem 编译为目标文件 cl /c mylib1.cpp mylib2.cpp rem 创建静态库 lib /OUT:mylib.lib mylib1.obj mylib2.obj

2. 静态库使用

代码示例:

mylib.h

#pragma once #ifdef MYLIB_EXPORTS #define MYLIB_API __declspec(dllexport) #else #define MYLIB_API __declspec(dllimport) #endif MYLIB_API int add(int a, int b); MYLIB_API int subtract(int a, int b);

main.cpp

#include "mylib.h" #include <iostream> int main() { std::cout << "3 + 5 = " << add(3, 5) << std::endl; std::cout << "10 - 4 = " << subtract(10, 4) << std::endl; return 0; }
编译链接:
rem 方法1:直接链接 cl main.cpp mylib.lib rem 方法2:指定库目录 cl main.cpp /I include_path /link /LIBPATH:lib_path mylib.lib

二、动态库(DLL)

1. 动态库制作

方法一:使用__declspec(dllexport)

mydll.h

#pragma once #ifdef MYDLL_EXPORTS #define MYDLL_API __declspec(dllexport) #else #define MYDLL_API __declspec(dllimport) #endif extern "C" MYDLL_API int multiply(int a, int b); extern "C" MYDLL_API double divide(double a, double b);

mydll.cpp

#include "mydll.h" BOOL APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID lpReserved) { switch (reason) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } MYDLL_API int multiply(int a, int b) { return a * b; } MYDLL_API double divide(double a, double b) { if (b == 0) return 0; return a / b; }
方法二:使用模块定义文件(.def)

mydll.def

LIBRARY mydll EXPORTS multiply @1 divide @2
编译动态库:
rem 生成DLL和导入库 cl /D MYDLL_EXPORTS /LD mydll.cpp /link /DEF:mydll.def rem 或者使用 cl /D MYDLL_EXPORTS /LD mydll.cpp /Fe:mydll.dll /link /IMPLIB:mydll.lib

2. 动态库使用方式

方式一:隐式链接(最常用)
// main.cpp #include "mydll.h" #include <iostream> int main() { std::cout << "3 * 5 = " << multiply(3, 5) << std::endl; std::cout << "10 / 2 = " << divide(10, 2) << std::endl; return 0; }

编译:

cl main.cpp mydll.lib
方式二:显式链接(运行时加载)
#include <windows.h> #include <iostream> typedef int (*MultiplyFunc)(int, int); typedef double (*DivideFunc)(double, double); int main() { HINSTANCE hDll = LoadLibrary(TEXT("mydll.dll")); if (!hDll) { std::cerr << "无法加载DLL" << std::endl; return 1; } MultiplyFunc multiply = (MultiplyFunc)GetProcAddress(hDll, "multiply"); DivideFunc divide = (DivideFunc)GetProcAddress(hDll, "divide"); if (multiply && divide) { std::cout << "3 * 5 = " << multiply(3, 5) << std::endl; std::cout << "10 / 2 = " << divide(10, 2) << std::endl; } FreeLibrary(hDll); return 0; }

3. 使用CMake构建库

CMakeLists.txt(静态库):

cmake_minimum_required(VERSION 3.10) project(MyStaticLib) add_library(mystatic STATIC src/mylib1.cpp src/mylib2.cpp ) target_include_directories(mystatic PUBLIC include)

CMakeLists.txt(动态库):

cmake_minimum_required(VERSION 3.10) project(MyDynamicLib) add_library(mydynamic SHARED src/mydll.cpp ) target_include_directories(mydynamic PUBLIC include)

三、主要区别和使用建议

特性静态库 (.lib)动态库 (DLL)
链接时机编译时运行时
文件大小可执行文件较大可执行文件较小
更新需要重新编译替换DLL即可
内存使用每个程序单独加载多程序共享
加载速度相对较慢
依赖管理简单需确保DLL存在

四、实用技巧

  1. 依赖查看:使用dumpbin /exports mydll.dll查看导出函数

  2. 依赖追踪:使用 Dependency Walker 或dumpbin /dependents program.exe

  3. 版本控制:在DLL中设置版本信息(.rc文件)

  4. 调试DLL:设置调试器加载符号,或在DLL项目中设置调试命令

五、常见问题解决

  1. 找不到DLL:确保DLL在程序目录、系统目录或PATH包含的目录中

  2. 导出函数名修饰:使用extern "C"避免C++名称修饰

  3. 运行时错误:检查DLL依赖的运行时库版本(MSVCRT)

  4. 符号冲突:使用静态库时注意全局变量和函数的命名

建议根据项目需求选择:

  • 小型工具或嵌入式环境 → 静态库

  • 大型系统或需要插件机制 → 动态库

  • 需要热更新功能 → 动态库 + 显式加载

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/22 22:59:54

UI-TARS智能体:重新定义人机交互的下一代GUI自动化革命

UI-TARS智能体&#xff1a;重新定义人机交互的下一代GUI自动化革命 【免费下载链接】UI-TARS-72B-DPO 项目地址: https://ai.gitcode.com/hf_mirrors/ByteDance-Seed/UI-TARS-72B-DPO 当AI学会"看屏幕"并自主操作界面时&#xff0c;传统的人机交互模式正在被…

作者头像 李华
网站建设 2026/4/23 9:44:29

如何快速解决XAPK安装问题:小白也能懂的完整转换指南

如何快速解决XAPK安装问题&#xff1a;小白也能懂的完整转换指南 【免费下载链接】xapk-to-apk A simple standalone python script that converts .xapk file into a normal universal .apk file 项目地址: https://gitcode.com/gh_mirrors/xa/xapk-to-apk 你是否曾经兴…

作者头像 李华
网站建设 2026/4/23 9:45:23

15、高级psad主题:从签名匹配到操作系统指纹识别

高级psad主题:从签名匹配到操作系统指纹识别 在网络安全领域,psad是一款强大的工具,它在检测和防范各种网络攻击方面发挥着重要作用。本文将深入探讨psad的高级主题,包括签名匹配和操作系统指纹识别。 1. psad_ip_len关键字 psad_ip_len关键字用于指定iptables日志消息中…

作者头像 李华
网站建设 2026/4/23 12:36:48

17、利用psad进行主动响应

利用psad进行主动响应 在当今复杂的网络环境中,网络攻击层出不穷,如何有效地应对这些攻击成为了网络安全领域的重要课题。psad(Port Scan Attack Detector)是一款强大的端口扫描攻击检测工具,它不仅能够检测各种网络攻击,还具备主动响应的能力,能够动态地调整防火墙策略…

作者头像 李华
网站建设 2026/4/23 11:11:54

270M参数撬动百亿边缘市场:Gemma 3微型模型重塑终端AI生态

270M参数撬动百亿边缘市场&#xff1a;Gemma 3微型模型重塑终端AI生态 【免费下载链接】gemma-3-270m-unsloth-bnb-4bit 项目地址: https://ai.gitcode.com/hf_mirrors/unsloth/gemma-3-270m-unsloth-bnb-4bit 导语 手机25次对话仅耗电0.75%&#xff0c;谷歌Gemma 3 2…

作者头像 李华
网站建设 2026/4/23 12:54:41

springboot基于vue的高校人力资源管理系统 人事管理系统_y82mp9g4

目录已开发项目效果实现截图开发技术系统开发工具&#xff1a;核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&…

作者头像 李华