windows dll和lib生成以及详解

libssh 0.10.0 Windows 编译与集成:CMake + VS2022 生成 DLL/LIB 的 3 种配置方法对比 本文详细介绍了在Windows平台使用CMake和VS2022编译libssh 0.10.0库的三种配置方法,包括项目属性直接配置、文件复制到项目目录和环境变量全局配置。通过对比分析各方案的优缺点,帮助开发者高效集成SSH/SFTP功能,解决常见的编译和运行时依赖问题。 阅读详情

【目录】

lib dll介绍

生成动态库

调用动态库

生成静态库

调用静态库


 

首先介绍一下静态库(静态链接库)、动态库(动态链接库)的概念,首先两者都是代码共享的方式。

静态库:在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中,这种库称为静态库,其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。即静态库中的指令都全部被直接包含在最终生成的 EXE 文件中了。在vs中新建生成静态库的工程,编译生成成功后,只产生一个.lib文件

动态库:动态链接库是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。在vs中新建生成动态库的工程,编译成功后,产生一个.lib文件和一个.dll文件

那么上述静态库和动态库中的lib有什么区别呢?

静态库中的lib:该LIB包含函数代码本身(即包括函数的索引,也包括实现),在编译时直接将代码加入程序当中

动态库中的lib:该LIB包含了函数所在的DLL文件和文件中函数位置的信息(索引),函数实现代码由运行时加载在进程空间中的DLL提供

总之,lib是编译时用到的,dll是运行时用到的。如果要完成源代码的编译,只需要lib;如果要使动态链接的程序运行起来,只需要dll。

以下例子均在vs2010上测试


生成和使用动态库

生成动态库

 新建项目--win32项目--填写项目名--确定--下一步--应用程序类型:选择dll--附加选项:选择导出符号--完成

可以看到生成了一个dllmain.cpp 文件,这是dll应用程序的入口,注意它和普通工程的入口main函数不同,这个文件我们不需要修改。

 在这个动态库中我们举例导出一个变量,一个类,一个函数,头文件dll.h如下:

复制代码
 1 //新建生成dll的工程时,vs默认定义了宏DLL_EXPORT,因此,DLL_API 是 __declspec(dllexport),用来导出
 2 //当我们在静态调用dll时,我们包含该头文件,由于没有定义DLL_EXPORT,所以DLL_API是
 3 //__declspec(dllimport),用来导入
 4 #ifdef DLL_EXPORTS
 5 #define DLL_API __declspec(dllexport)
 6 #else
 7 #define DLL_API __declspec(dllimport)
 8 #endif
 9 
10 // 导出类
11 class DLL_API Cdll {
12 public:
13     Cdll(void);
14     // TODO: 在此添加您的方法。
15 };
16 
17 //导出变量,变量在.cpp文件中定义
18 extern DLL_API int ndll;
19 
20 //导出函数,加extern "C",是为了保证编译时生成的函数名不变,这样动态调用dll时才能
21 //正确获取函数的地址
22 extern "C" DLL_API int fndll(void);
复制代码

dll.cpp 文件如下:

复制代码
 1 #include "dll.h"
 2 
 3 
 4 // 这是导出变量的一个示例
 5 DLL_API int ndll=6;
 6 
 7 // 这是导出函数的一个示例。
 8 DLL_API int fndll(void)
 9 {
10     return 42;
11 }
12 
13 // 这是已导出类的构造函数。
14 // 有关类定义的信息,请参阅 dll.h
15 Cdll::Cdll()
16 {
17     return;
18 }
复制代码

调用动态库

有两种方法调用动态库,一种隐式链接,一种显示链接。

调用动态库:隐式链接

隐式链接 需要.h文件,dll文件,lib文件

(1)将dll放到工程的工作目录

(2)设置项目属性--vc++目录--库目录为lib所在的路径

(3)将lib添加到项目属性--链接器--输入--附加依赖项(或者直接在源代码中加入#pragma comment(lib, “**.lib”))

(4)在源文件中添加.h头文件

然后就像平常一样调用普通函数、类、变量

调用动态库:显示链接

显示链接 只需要.dll文件,但是这种调用方式不能调用dll中的变量或者类(其实可以调用类,但是相当麻烦,有兴趣者可参考http://blog.youkuaiyun.com/jdcb2001/article/details/1394883)

显示调用主要使用WIN32 API函数LoadLibrary、GetProcAddress,举例如下:

复制代码
 1 typedef int (*dllfun)(void);//定义指向dll中函数的函数指针
 2     HINSTANCE hlib = LoadLibrary(".\\dll.dll");
 3     if(!hlib)
 4     {
 5         std::cout<<"load dll error\n";
 6         return -1;
 7     }
 8     dllfun fun = (dllfun)GetProcAddress(hlib,"fndll");
 9     if(!fun)
10     {
11         std::cout<<"load fun error\n";
12         return -1;
13     }
14     fun();
复制代码

生成和使用静态库

生成静态库

新建项目--win32项目--填写项目名--确定--下一步--应用程序类型:选择静态库

静态库项目没有main函数,也没有像dll项目中的dllmain。

创建项目后添加.h文件,添加相应的导出函数、变量或类,如下所示

复制代码
 1 #ifndef _MYLIB_H_
 2 #define _MYLIB_H_
 3 
 4 void fun(int a);
 5 
 6 extern int k;
 7 
 8 class testclass
 9 {
10 public:
11     testclass();
12     void print();
13 };
14 
15 #endif
复制代码

.cpp文件如下

复制代码
 1 #include "stdafx.h"
 2 #include "lib.h"
 3 #include <iostream>
 4 
 5 void fun(int a)
 6 {
 7     std::cout<<a<<"lib gen\n";
 8 }
 9 
10 int k = 222;
11 
12 testclass::testclass()
13 {
14     std::cout<<"123\n";
15 }
16 
17 void testclass::print()
18 {
19     std::cout<<"this is testcalss\n";
20 }
复制代码

编译工程后就会生成一个.lib文件

使用静态库

需要.h文件,lib文件

(1)设置项目属性--vc++目录--库目录为lib所在的路径

(2)将lib添加到项目属性--链接器--输入--附加依赖项(或者直接在源代码中加入#pragma comment(lib, “**.lib”))

(3)在源文件中添加.h头文件

然后就像平常一样调用普通函数、类、变量,举例如下:

复制代码
 1 #include <iostream>
 2 #include "lib.h"
 3 
 4 #pragma comment(lib, "lib.lib")
 5 
 6 int main()
 7 {
 8     fun(4);
 9     std::cout<<k<<std::endl;
10     testclass tc; 
11     tc.print();
12     return 0;
13 }
复制代码

 【版权声明】转载请注明出处 http://www.cnblogs.com/TenosDoIt/p/3203137.html

从动态链接库(.dll)生成库文件(.lib)的方法 阅读详情

相关推荐

lib和dll静态库和动态库

无论哪种lib,都是给编译/链接阶段告诉链接器“你用的函数/类在哪里,是否存在”;静态库的lib:直接把代码复制进来;动态库的导入库:记录dll的位置信息,相当于“给链接器一个定心丸”。把库代码编译成二进制指令,打包成一个.dll文件,运行时才会被加载到内存。相当于“把别人写好的代码,放在一个‘共享文件’里,谁需要谁就临时来借(加载)”。

fucheng的博客 1067

静态库(lib)和动态库(dll)的使用

静态库(lib)和动态库(dll)的理解与使用前言一、函数重载的理解二、extern “C” 的理解三、静态库的调用1.静态库的生成2.静态库的调用四、动态库的调用1.动态库的生成2.动态库的调用 前言 说明   静态库和动态库在windows软件开发当中很常用,好的软件架构很多功能都是以库的形式存在,假如该功能需要升级,则直接替换该库文件就行,不需要把整个程序进行升级。这样维护起来就比较方便。   常见的库文件有.lib和.dll两种形式,分别是静态库和动态库。   静态库在形成exe文..

张一西的博客 8329

Windows 10下用MINGW64编译libusb-1.0的完整避坑指南(附VS2010生成.lib文件)

本文提供了在Windows 10系统下,使用MINGW64工具链编译libusb-1.0库的详细步骤与避坑指南。内容涵盖从MSYS2环境配置、源码编译到生成Visual Studio 2010可用的.lib文件的完整流程,并解决了跨工具链兼容性问题,帮助开发者高效完成USB开发库的构建与集成。

weixin_28829629的博客 255

lib 和 dll 的区别

首先介绍一下静态库(静态链接库)、动态库(动态链接库)的概念,首先两者都是代码共享的方式。 静态库:在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中,这种库称为静态库,其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。即静态库中的指令都全部被直接包含在最终生成的 EXE 文件中了。在vs中新建生成静态库的工程,编译生成成功后,只产生一个.l...

每一个不曾起舞的日子,都是对人生的辜负。 949

跨平台DLL实战:从Clion生成到QT、VS、C#多环境集成指南

本文详细介绍了如何在CLion中生成DLL,并跨平台集成到QT、Visual Studio和C#项目中。从DLL的创建、导出函数配置,到在不同开发环境中的调用方法,提供了实战技巧和常见问题解决方案,帮助开发者高效实现代码复用和跨平台集成。

weixin_28829339的博客 237

Visual Studio C++ DLL创建与调用实战:从原理到避坑指南

动态链接库(DLL)是Windows系统编程和模块化开发的核心技术,它通过共享代码实现程序间的功能复用,有效减少应用程序体积并支持独立更新。其工作原理基于导出与导入机制,允许主程序在运行时加载外部库函数,在插件系统、多语言支持和性能优化等场景中具有重要价值。本文聚焦于使用Visual Studio和C++进行DLL开发,详细解析了从项目创建、函数导出、隐式链接到调试部署的全流程,并针对常见的“DLL地狱”和内存管理问题提供了工程实践层面的解决方案,帮助开发者掌握这一基础且关键的Windows开发技能。

weixin_28837817的博客 353

windows下lib 和 dll 的区别、生成以和使用详解

    转至:http://www.cnblogs.com/TenosDoIt/p/3203137.html首先介绍一下静态库(静态链接库)、动态库(动态链接库)的概念,首先两者都是代码共享的方式。静态库:在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中,这种库称为静态库,其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。即静态库中的指令都...

a1173356881的博客 7167

zlib-1.3.1多版本编译实战:动态库与静态库的生成与使用详解

本文详细介绍了在Windows平台上编译zlib-1.3.1库的实战指南,重点讲解如何通过定制CMakeLists.txt实现动态库与静态库的多版本并行构建,一次性生成适配不同Visual Studio运行时库(如MD/MT)的库文件,并提供了项目集成与链接的避坑方案。

weixin_28842269的博客 280

FFmpeg Windows 编译只生成了 .def 文件?教你轻松转换为 .lib(MSVC 兼容)

当你遇到 FFmpeg 编译后只有.def而没有.lib时,用 Visual Studio 的lib.exe工具,一条命令就能转换成功。记住三步:打开。进入.def文件目录。执行。这样你就能得到 MSVC 兼容的.lib文件,顺利集成到你的 Qt 项目中。

AC的博客 459

动态链接库——DLL文件

引入库文件包含被DLL导出的函数的名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到所需要使用的DLL文件,库中的函数和数据并不复制到可执行文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中所要调用的函数的内存地址,这样当一个或多个应用程序运行是再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。dll通常包含的是多个程序都能用到的代码和数据,一般大型软件都有一个exe和一堆dll文件。将库中的代码先加载到内存中,再链接到可执行文件中。

qq_43199575的博客 691

Windows下编译GSL科学计算库:vcpkg与MSYS2实战指南

GNU科学计算库(GSL)是科研与工程中常用的C/C++数值计算库,提供特殊函数、线性代数、插值拟合等能力。但其官方构建基于autotools,在Windows+VS2019环境下难以直接编译。借助微软vcpkg包管理器,可一条命令生成与MSVC完全兼容的动态库和静态库;若需锁定版本或修改源码,则可通过MSYS2进行源码编译,并借助gendef与lib工具生成VS可用的导入库。本文系统对比两种方案,覆盖动态库/静态库选择、GSL_DLL宏、CRT运行时匹配等关键配置,并总结常见链接错误与DLL分发问题,帮助

weixin_42529328的博客 282

C++生成动态和静态链接,以及调用方法(手把手教程)

C++生成dll和lib文件,以及调用库文件的详细使用说明

宏笋的博客 864

OpenSSL 1.0 64位静态库 libeay64.lib / ssleay64.lib 编译与Visual Studio链接指南

在Windows C/C++工程中,静态库与动态库导入库是两种完全不同的链接产物。静态库将实现代码直接嵌入可执行文件,运行时无需额外DLL,适合工控、医疗等需要免安装部署的场景。OpenSSL 1.0时代,32位静态库默认命名为libeay32.lib和ssleay32.lib,而64位版本常被手动改名为libeay64.lib和ssleay64.lib,导致许多新开发者困惑。理解这一历史命名规则后,可通过Perl Configure VC-WIN64A、ms\do_win64a.bat及nmake -f

weixin_26804345的博客 258

Visual Studio 2022 MFC DLL 创建实战:3步生成 .h/.lib/.dll 三件套(附完整代码)

本文详细介绍了在Visual Studio 2022中创建MFC动态链接库(DLL)的完整流程,包括项目配置、导出接口实现、三件套(.h/.lib/.dll)生成以及高级应用技巧。通过实战示例展示如何开发高效的Windows平台DLL模块,涵盖内存管理、调试技巧和性能优化等关键知识点,帮助开发者快速掌握MFC DLL开发核心技术。

weixin_30383279的博客 363

【Shader】Unity批量更换Shader

在Unity开发中,因为渲染管线问题,经常会遇到需要大量更改shader的问题,本篇文章讲述批量更换Shader的工具。

憨辰 1467

告别“为了写而写”:GJB438C-2021新规下,软件文档如何真正为项目服务?

本文深入解析GJB438C-2021新规如何重构软件文档的实战价值,通过文档体系瘦身、流程再造和敏捷化实践,显著提升军工软件项目的效率。新标准删除30%冗余文档,引入动态编制法和轻量化模板,使文档编制工作量降低37%,关键路径周期缩短15%。

weixin_30765577的博客 448

libssh 0.10.0 Windows 编译实战:CMake + VS2022 生成 DLL/LIB 的 3 种配置方法

本文详细介绍了在Windows平台使用CMake和VS2022编译libssh 0.10.0的完整流程,包括环境准备、源代码获取、三种CMake配置方法以及常见问题解决方案。重点讲解了如何生成DLL/LIB文件,并对比了三种项目集成方案的优缺点,帮助开发者高效实现SSH/SFTP安全传输功能。

weixin_32187037的博客 323

从FPGA工程师视角看CXP-12:如何用Xilinx GTX/GTH收发器搞定一条50Gbps的工业相机数据流?

本文从FPGA工程师视角详细解析了如何利用Xilinx GTX/GTH收发器实现50Gbps的CXP-12工业相机数据流传输。通过协议分析、硬件设计要点和FPGA逻辑实现,帮助开发者高效构建高带宽工业视觉系统,特别适合4K/8K高分辨率图像处理需求。

weixin_42533622的博客 282

Faiss C API 在 Windows 上编译跑通:2 个 CMake 开关 + 1 份 DLL 部署清单

Faiss 的 C API 在 Windows 上集成,大部分项目卡在三个位置:链接期报"无法解析的外部符号"、运行期弹"找不到 faiss_c.dll"、编译期找不到 omp.h。三个问题根因都明确,本文按故障场景逐个给出解法。 ## 先定位你的故障在哪一层 Windows 下 faiss C API 的报错,表象相似、根因不同。对照下面的表,先判断你卡在哪一层,再看对应章节: | 表象

gitblog_01134的博客 199

Unity四部曲(核心)

需要先改成Cube复杂的展开留到unity进阶再说。

ultraman1234566的博客 2797

基于微信小程序的垃圾分类系统,附源码

垃圾分类小程序管理员功能有个人中心,管理员管理,意见反馈管理,视频类型管理,垃圾类型管理,新闻类型管理,论坛信息管理,环保视频管理,环保知识管理,垃圾信息管理,环保新闻管理,用户管理,知识问答试卷管理,试题管理,测试管理,轮播图管理。用户可以在微信小程序上面注册登录,查看各种环保信息和垃圾信息,还可以参加知识问答等操作。垃圾分类小程序的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。

Java徐师兄的博客 2076

windows下lib,dll的生成及使用

导入库lib的生成: 文件mylib.dll 1、先用dumpbin.exe生成.def文件 (注:用vs2010下的dumpbin时,缺少mspdb100.dll,将Microsoft VisualStudio10.0\Common7\IDE\mspdb100.dll复制到\Microsoft Visual Studio 10.0\VC\bin;         移动后编译工程时会出现

u010945181的专栏 1572

详解STM32F407双重ADC同步采集与DMA传输的配置技巧及实战应用

本文详细解析了STM32F407双重ADC同步采集与DMA传输的配置技巧及实战应用。通过CubeMX配置、代码实现和常见问题解决方案,帮助开发者高效实现多通道数据同步采集,提升工业自动化和嵌入式系统的数据采集效率与精度。

ii567的博客 364

Halcon算法如何封装成DLL供C++调用?一个加法乘法函数的模块化实战(VS2019+DEF文件详解)

本文详细介绍了如何将Halcon算法封装成DLL供C++调用,特别针对VS2019环境下的模块定义文件(.def)应用进行实战解析。通过加法乘法函数的模块化示例,展示了从项目配置、函数实现到高级优化的完整流程,帮助开发者解决工业视觉开发中的代码维护与复用难题。

weixin_30588675的博客 376

14、OpenClaw(龙虾助手)Skill 开发完整规范(2026最新版)

OpenClaw Skill 开发指南摘要: Skill 是 OpenClaw AI 助手的核心扩展机制,支持声明式(SKILL.md)和原生代码(JS/TS/Python)两种开发模式。声明式 Skill 通过 Markdown 定义触发条件和执行流程,适合简单业务;原生代码 Skill 提供完整编程能力,适合复杂场景。开发需遵循标准化项目结构,包含 SKILL.md(元数据)、manifest.json(权限声明)等文件,并严格处理错误和多系统适配。新版要求原生 Skill 必须声明文件、网络等权限,确

欢迎光临~知1而N的博客 1242

在RStudio中使用GitHub Copilot:代码自动生成,从此告别手敲!

可以通过自定义提示词来引导Copilot生成符合自己需求的代码。再看一个做统计分析的。

Codewar的博客 331
上一篇: Qt高质量的开源项目合集
下一篇: Duilib编译及使用
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值