动态链接库、静态库区别与VS2005项目相关设置(转载)

VS创建和使用C++动态链接库教程 环境 阅读详情

动态链接库、静态库区别

      1、动态链接库(Dynamic Linked Library)
      Windows系统平台上你可以将独立的程序模块创建为较小的DLL(Dynamic Linkable Library)文件,并可对它们单独编译和测试。在运行时,只有当EXE程序确实要调用这些DLL模块的情况下,系统才会将它们装载到内存空间中。这种方式不仅减少了EXE文件的大小和对内存空间的需求,而且使这些DLL模块可以同时被多个应用程序使用。Windows自己就将一些主要的系统功能以DLL模块的形式实现。Windows为应用程序提供了丰富的函数调用,这些函数调用都包含在动态链接库中。其中有3个最重要的DLL,Kernel32.dll,它包含用于管理内存、进程和线程的各个函数;User32.dll,它包含用于执行用户界面任务(如窗口的创建和消息的传送)的各个函数;GDI32.dll,它包含用于画图和显示文本的各个函数。

      在使用动态链接库的时候,往往提供两个文件:一个引入库(Import Library)和一个DLL。引入库包含被DLL导出的函数和变量的符号名,DLL包含实际的函数和数据。在编译链接可执行文件时,只需要链接引入库,DLL中的函数代码和数据并不复制到可执行文件中,在运行的时候,再去加载DLL,访问DLL中导出的函数。 一个Windows的.EXE文件拥有它使用不同动态链接库的引用,所使用的函数即在那里。当Windows程序被加载到内存中时,程序中的调用被指向DLL函数的入口,如果DLL不在内存中,系统就将其加载到内存中。当链接Windows程序以产生一个可执行文件时,你必须链接由编程环境提供的专门的“导入库(import library)库”。这些导入库包含了动态链接库名称和所有Windows函数调用的引用信息。链接程序使用该信息在.EXE文件中构造一个表,当加载程序时,Windows使用它将调用转换为Windows函数。

      2、静态库(Static Library)
      函数和数据被编译进一个二进制文件(通常扩展名为.LIB)。在使用静态库的情况下,在编译链接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其它模块组合起来创建最终的可执行文件(.EXE文件)。
      导入库和静态库的区别很大,他们实质是不一样的东西。静态库本身就包含了实际执行代码、符号表等等,而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息。

      静态链接与动态链接:

      静态链接方法:#pragma comment(lib, "test.lib") ,静态链接的时候,载入代码就会把程序会用到的动态代码或动态代码的地址确定下来静态库的链接可以使用静态链接,动态链接库也可以使用这种方法链接导入库

      动态链接方法:LoadLibrary()/GetProcessAddress()和FreeLibrary(),使用这种方式的程序并不在一开始就完成动态链接,而是直到真正调用动态库代码时,载入程序才计算(被调用的那部分)动态代码的逻辑地址,然后等到某个时候,程序又需要调用另外某块动态代码时,载入程序又去计算这部分代码的逻辑地址,所以,这种方式使程序初始化时间较短,但运行期间的性能比不上静态链接的程序。


VS2005项目相关设置

      应用程序使用外部库时需要进行加载,两种库的加载本质上都是一样:提供功能和功能的定义!vs2005 c++ 项目设置外部库方法如下:

     1. 添加编译所需要(依赖)的 lib 文件

         在“项目->属性->配置属性->连接器->输入->附加依赖项”里填写“winsock.lib”,多个 lib 以空格隔开,等同于“#pragma   

         comment(lib, "*.lib") ”语句。

     2. 添加库(libs)文件目录

         方法 1:项目->属性->配置属性->连接器->常规->附加库目录”
         方法 2:[菜单]“工具->选项->项目和解决方案->c++ 目录”,选择对应平台,然后添加所需“库文件”目录

         这个设置类似于设置环境变量,主要是为程序设置搜索的库目录,真正进行库加载还需要进行第一种设置!

     3. 添加包含(include)文件目录
         方法 1:“项目->属性->配置属性->c/c++->常规->附加包含目录”
         方法 2:[菜单]“工具->选项->项目和解决方案->c++ 目录”,添加所需“包括文件”目录

         方法2类似于设置环境变量。

     4. 导入库(import)

         在“项目->属性->配置属性->连接器->高级->导入库”填写需要生成的导入库


#pragma预处理指令

     在所有的预处理指令中,#pragma指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。
  其格式一般为: #Pragma Para
  其中Para 为参数,下面来看一些常用的参数。
  1、message 参数。 Message 参数能够在编译信息输出窗口中输出相应的信息,这对于源代码信息的控制是非常重要的。其使用方法为:
  #Pragma message(“消息文本”)
  当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。
  2、另一个使用得比较多的pragma参数是code_seg。格式如:
  #pragma code_seg( ["section-name"[,"section-class"] ] )
  它能够设置程序中函数代码存放的代码段,当我们开发驱动程序的时候就会使用到它。
  3、#pragma once (比较常用)
  只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上在VC6中就已经有了,但是考虑到兼容性并没有太多的使用它。
  #pragma once是编译相关,就是说这个编译系统上能用,但在其他编译系统不一定可以,也就是说移植性差,不过现在基本上已经是每个编译器都有这个定义了。
  4、#pragma warning( disable : 4507 34; once : 4385; error : 164 )
  等价于:
  #pragma warning(disable:4507 34) // 不显示4507和34号警告信息
  #pragma warning(once:4385) // 4385号警告信息仅报告一次
  #pragma warning(error:164) // 把164号警告信息作为一个错误。
  同时这个pragma warning 也支持如下格式:
  #pragma warning( push [ ,n ] )
  #pragma warning( pop )
  这里n代表一个警告等级(1---4)。
  #pragma warning( push )保存所有警告信息的现有的警告状态。
  #pragma warning( push, n)保存所有警告信息的现有的警告状态,并且把全局警告等级设定为n。
  #pragma warning( pop )向栈中弹出最后一个警告信息,
  在入栈和出栈之间所作的一切改动取消。例如:
  #pragma warning( push )
  #pragma warning( disable : 4705 )
  #pragma warning( disable : 4706 )
  #pragma warning( disable : 4707 )
  //.......
  #pragma warning( pop )
  在这段代码的最后,重新保存所有的警告信息(包括4705,4706和4707)。
  5、#pragma comment(...)
  该指令将一个注释记录放入一个对象文件或可执行文件中,常用的lib关键字,可以帮我们连入一个库文件。该指令的格式为

          #pragma comment( "comment-type" [, commentstring] )

      该指令将一个注释记录放入一个对象文件或可执行文件中,comment-type(注释类型):可以指定为五种预定义的标识符的其中一种五种预定义的标识符为:

      compiler:将编译器的版本号和名称放入目标文件中,本条注释记录将被编译器忽略,如果你为该记录类型提供了commentstring参数,编译器将会产生一个警告,例如:#pragma comment( compiler )。

      exestr:将commentstring参数放入目标文件中,在链接的时候这个字符串将被放入到可执行文件中,当操作系统加载可执行文件的时候,该参数字符串不会被加载到内存中.但是,该字符串可以被dumpbin之类的程序查找出并打印出来,你可以用这个标识符将版本号码之类的信息嵌入到可执行文件中。

      lib:这是一个非常常用的关键字,用来将一个库文件链接到目标文件中常用的lib关键字,可以帮我们连入一个库文件。例如:

          #pragma comment(lib, "user32.lib"), 该指令用来将user32.lib库文件加入到本工程中。

      linker:将一个链接选项放入目标文件中,你可以使用这个指令来代替由命令行传入的或者在开发环境中设置的链接选项,你可以设定/include选项来强制包含某个对象。

 

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/Ocean2006/archive/2010/02/05/5289908.aspx

VS动态/静态链接库的使用方法 c++分为静态、动态链接库两种。使用静态库编译时将库中的代码编译进程序,生成的程序能够独立运行。而使用动态链接库在编译时不将库中的代码编译进程序,生成的程序在运行时需要动态库的支持。 阅读详情

相关推荐

VMware桥接模式实战:用手机热点给Linux虚拟机共享网络(附WiFi适配技巧)

本文详细介绍了在移动办公场景下,如何为VMware中的Linux虚拟机配置桥接模式,以通过手机热点共享网络。文章深入解析了桥接模式在无线环境下的工作原理,提供了从主机端准备、VMware设置到Linux虚拟机内部配置的完整实战步骤,并针对手机热点的特殊性,分享了MTU优化、DNS配置及常见网络问题的诊断与解决方案,帮助用户实现稳定高效的移动虚拟化办公。

2y3u4i5o6p的博客 1197

动态链接库、静态库区别与VS2005项目相关设置

出处:http://blog.youkuaiyun.com/Ocean2006/archive/2010/02/05/5289908.aspx     一、动态链接库、静态库区别     二、VS2005项目相关设置     三、#pragma预处理指令动态链接库、静态库区别      1、动态链接库(Dynamic Linked Library)      Windows系统平台上你可以将独立的程序模块创建为较小的DLL(Dynamic Linkable Library)文件,并可对它们单独编译和测试。在运行时,只有

tuhuolong的专栏 813

别再浪费NFC了!手把手教你用Android手机模拟门禁卡(Mifare Classic破解教程)

本文深入探讨Android NFC技术的核心原理与创新应用,教你如何利用手机模拟门禁卡(Mifare Classic破解教程),解锁智能生活的无限可能。涵盖NFC标签类型解析、HCE开发实战及安全实践,让你的Android设备成为数字生活的万能钥匙。

weixin_29239661的博客 231

在vs2005中使用静态链接库和动态链接库

静态链接库: 首先,静态链接库的使用需要库的开发者提供生成库的.h头文件和.lib文件。生成库的.h头文件中的声明格式如下:     extern "C" 函数返回类型 函数名(参数表);     在调用程序的.cpp源代码文件中如下:     #include "..\lib.h"     #pragma comment(lib,"..\\debug\\libTest.lib") //

startwithdp的专栏 3770

从零上手:基于英飞凌TC377的UDE STK 5.0实战调试指南

本文详细介绍了基于英飞凌TC377芯片和UDE STK 5.0的实战调试指南,涵盖硬件连接、工作空间配置、程序烧录、多核调试等关键步骤。特别针对汽车电子领域常见的多核架构调试难题,提供了断点设置、变量监控等实用技巧,帮助开发者快速上手并优化调试效率。

weixin_30839881的博客 684

VirusTotal API密钥获取与Python实战:从注册到自动化威胁分析

在网络安全和自动化运维领域,API(应用程序编程接口)是实现系统间数据交互与功能集成的核心技术。其工作原理是通过预定义的协议和端点,允许程序化访问特定服务的数据与功能。对于安全工程师和威胁分析师而言,API的价值在于能够将手动、重复的安全操作(如文件扫描、情报查询)转化为自动化工作流,从而极大提升威胁检测与响应的效率。一个典型的应用场景是集成第三方威胁情报平台,以实现对可疑文件、URL或哈希值的批量与实时分析。本文聚焦于全球知名的威胁情报服务VirusTotal,详细解析其API密钥的注册流程、安全配置要点

weixin_28707739的博客 421

VS2005下使用dynamic_cast

由于项目中需要使用dynamic_cast,就写了个小代码测试下,谁知编译不过去,我把代码看了半天,都找不见错误,跟踪也不行,我就到qq群了寻找高手帮我解决,有位朋友看了下说程序没有问题。我就到网上搜了下,原来要用dynamic_cast,要在项目的属性下的C++语言中,启动运行时类型,选择:是(/GR)。又学了一招,呵呵。

LixueStudy的专栏 299

正弦波产生电路_文氏桥振荡

本文以文氏桥振荡为基础产生正弦波,介绍了原理、计算、应用时需要注意的一些点,并给出了实测可用的电路模板

白鹤忘机的博客 3万+

VS2005创建DLL

VS2005创建DLL 使用VS2005创建自己的动态链接库,这样就不用看到DLL文件有抵触情感了。 一、打开VS2005软件,创建DLL工程。起名ceshi1. 1)     2) 点击下一步,应用程序类型为DLL,空工程。 3) 完成,一个新的DLL工程设置完毕,接下来编辑源码 添加头文件,命名为ceshi1.h,编辑内容: #ifndef CESH

liulina603的专栏 6278

【腾讯小龙虾WorkBuddy专栏05】深度解析WorkBuddy连接器(Connector)

深度解析WorkBuddy连接器(Connector)

AI人人懂 1316

基于YOLO26深度学习框架的人脸识别门禁系统的算法研究实现方法

本文研究了基于YOLO26深度学习框架的人脸识别门禁系统实现方法。系统采用YOLO26目标检测算法,通过CSPDarknet53主干网络、特征金字塔结构和注意力机制实现高效人脸检测。研究内容包括数据预处理、模型训练优化和身份验证等关键技术,使用迁移学习策略和CIoU损失函数提升检测精度。该系统可应用于智能安防场景,具有实时性强、识别准确的特点,为门禁管理提供了智能化解决方案。

一键难忘的博客 766

VS 生成动态链接库 方法

动态链接库(DLL) DLL 通常不能直接运行、也不能接收消息; 一般将某种功能的函数放在一个动态链接库中,然后提供给其他程序调用; 像WindowsAPI的所有函数都包含在DLL中,其中有3个DLL 最重要: 分别是: 1.Kernel32.dll:用于内存管理、创建进程线程; 2.User32.dll:用于执行用户界面任务,创建窗口、消息传递等; 3.GDI32.dll:用于画图和文本显示; 静态库和动态库: 静态库: .LIB:函数和数据被编译至该二进制文件;在使用lib时,在编译

u013565064的博客 1407

【Flink on k8s】- 1 - Flink Kubernetes Operator 简介 2023

Flink Kubernetes Operator 可以与 Kubernetes 的其他功能和工具集成,可以帮助用户快速定位和解决问题。Flink Kubernetes Operator可以在Kubernetes上实现高可用性,以确保 Flink 集群的稳定性和可靠性。Flink Kubernetes Operator 可以快速地部署 Flink 集群,而无需手动配置和管理集群。Flink Kubernetes Operator可以将Flink集群与其他应用程序隔离,以避免资源争用和干扰。

欢迎来到我的博客,一起探索代码里的世界! 1348

VS 2008 使用静态库的时候报错

例如:默认库“libcmtd.lib”与其他库的使用冲突;请使用/NODEFAULTLIB:library  等等好多错误 以下是转载的一篇文章,用于解决这类问题: ( KingOX的提示:不知哪个大神写的!非常有益!阅读前需要对静态库(.lib)、动态库(.dll)、导入库(这个还是.lib)之间的区别联系有了解。建议先读读宋宝华先生的《VC++动态链接库(DLL)编程深入浅出 》)

u011269801的专栏 1476

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

转一篇比较详细的vc编译qt的文

1. /MT, /MTd, /MD, /MDd区别及如何在编译Qt SDK时配置这些选项 编译Qt SDK有动态和静态之分。 同时我们还要将debug与release也区分开来。 我们看的VS2005里面有下面的runtime Library,这里就有4中/MT(静态release), /MTd(静态debug), /MD(动态release), /MDd(动态debug)

oldmtn的专栏 1981

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

vs2005中 加了strmbase.lib 仍旧 error LNK2001: 无法解析的外部符号

 错误 56 error LNK2001: 无法解析的外部符号 "public: __thiscall CBaseVideoRenderer::CBaseVideoRenderer(struct _GUID const &,wchar_t *,struct IUnknown *,long *)" (??0CBaseVideoRenderer@@QAE@ABU_GUID@@PA_WPAUIUnk

Parfait的专栏 3579

vs2005中动态i链接库DLL的一个简单例子

在vs2005中对动态链接库做实验,来一个详细的能跑通的例子: 1、打开vs2005,文件-》新建-》项目,选择“win32项目”,在“名称”中输入“vsdll ”,点“确定”-》下一步,在“应用程序设置”的“应用程序类型”中选择“DLL”,“附加选项”中选择“空项目”,然后点“完成”。这样dll项目就建立起来了。 2、在建好的工程中“源文件”右键“添加新项”,选择“c++文件”,输入名字“v

chen825919148的专栏 3706

vs2005动态链接库的隐式调用

在利用VS2005开发需要隐式调用动态链接库的应用程序时,必须对引入库的调用进行设置,其方法有一般有下三种: 1:在vs2005中设置:项目->项目属性->配置属性->链接器->输入->"\\路径\\引入库名.lib".(引入库在当前项目的目录里,则可以省略路径) 2:直接对项目设置依赖项(对引用项目按右键,选择"项目依赖项",然后在弹出界面里选择被引用的动态链接库项目). 3:在程序中包含

坚持是世界上每个有所建树的人共有的品质! 818

vs2005中加入动态链接库的方法

在“项目---属性---链接器----输入---附加依赖项“ 加入.lib文件即可。

chen825919148的专栏 1343

如何在VS2005下生成动态运行时库

如果我们的工程采用的是动态链接MFC库,那我们的程序如果拷贝到一个没有转VC的电脑中,我们的程序要想正确运行,除了拷贝程序外,还要将运行时库拷贝过去,下面记录下如何创建动态运行时库: file-》New-》Project,在弹出的窗口选other Project Types 下的Setup and Deployment,右侧选Setup Project. 然后在生成的工程文件中点击右键选A

专注 机器学习+人工智能 1149

linux静态库链接静态库导致的链接错误解决办法

在链接静态库时,如果多个静态库之间存在依赖关系,则有依赖关系的静态库之间存在链接顺序问题。这在使用静态库时需要注意,否则会报符号找不到的链接错误。 例如:lib2.a 依赖于 lib1.a,而最终可执行文件 test 依赖于 lib2.a,则链接选项应为:-llib2.a -llib1.a,而不能反过来,否则会报 lib1.a 中的某些符号未定义。

classMy的专栏 2204

静态库编译和连接遇到的奇怪问题

在编译静态库(lib)时,遇到过的三种问题:1,  如果没有正确包含lib文件的路径,会提示无法打开静态库。2,  error LNK 2001: 有可能是路径问题,或者是头文件与lib库不对应,或者是lib文件有问题。3,  error LNK 2005: 这个错误是微软设计错误,因此如果遇到这个错误,我们只能躲过这个链接错误。具体的办法就是将那个提示出错的库放到另外一个库的前面。另

冷秋魂的专栏 2060

“GCC连接静态库成功,G++连接静态库不成功”的解决方法

在Linux系统中引用第三方静态库后编译C++程序时经常会出现“Undefined Refrence to XXX”的错误提示,本文总结了产生这一错误的两种原因,并介绍了响应的解决办法

Slash Youth - Jack Chai 6911
上一篇: WINSOCK基础知识(套接字描述符)(转载)
下一篇: Peekmessage和Getmessage的区别(转载)
Leasangle
博客等级 码龄17年 32粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值