编译dll时,如何不依赖c++运行库

g++生成和使用c++动态/静态链接库教程 c++库分为动态库与静态库,它们的区别是 阅读详情

用VC编译的DLL如果依赖VC运行库,分发时如果目标系统不带对应版本的VC支行库,将导致DLl调用失败,在编译时应设置不依赖VC运行库:

在C/C++/Code Generation的Runtime Library中选择Multi-threaded(/MT)  Release配置或Multi-threaded Debug(/MTd) Debug配置就可以编译出不依赖VC运行库的DLL了。

image.png

在vs中,项目属性 -》C/C++ -》代码生成 -》运行库 选项内有四个选项:多线程(/MT)、多线程调试(/MTd)、多线程DLL(/MD)、多线程调试DLL(/MDd)。这个设置代表什么意思?四个选项又是什么意思,有什么区别?接下来详细讨论。

先奉上一个写得非常详细的博客链接:你所不知道的C和C++运行库,这个文章中写得非常详细,本文也主要参考了这篇文章。

还有这篇C Runtime Library 的来历。

1. 何为C运行库、C++标准库

C标准定义了一系列常用函数,成为C库函数。C标准仅仅定义了函数原型,没有提供实现。

因此这个任务留给了各个支持C语言标准的编译器。每个编译器通常实现了标准C的超集,称为C运行时库(C Run-Time Library)。

C run-time Library包含了C程序运行的最基本和最常用的函数,没有C run-time Library则main()函数不会被调用,exit()也不能被响应。C运行库与平台相关。

到了C++的世界,有了另外一个概念:Standard C++ Library。因为C++是C的超集,所以Standard C++ Library包括了C run-time Library和STL。

VC++针对C++ 加入的Standard C++ Library主要包括:libcp.lib、libcpmt.lib、msvcprt.lib。

在windows环境下,VC++提供的C Run-Time Library又分为动态运行时库和静态运行时库。

动态运行时库主要是DLL库文件msvcrt.dll(vc 6.0,之后是msvcr100.dll等),静态运行时库对应的主要文件是libc.lib(Single thread static library, retail version) 、LIBCMT.LIB (Multithread static library, retail version) 。msvcrt.dll运行时库提供几千个C函数,包括printf,程序运行时很大部分时间都是在这些运行库中。到底使用哪些库取决于你的编译器及编译选项:/MT、/MTd、/MD、/MDd。

动态运行时库(MD/MDd)

动态运行时库主要包括:

·DLL库文件:msvcrt.dll(或 MSVCRTD.DLL for debug build)

·对应的Import Library文件:MSVCRT.LIB(或 MSVCRTD.LIB for debug build)

上面为vc6.0编译器用到的库,在vs中为msvcr100.dll等

DLL版本名称根据编译器不同而不同,我们可以从名称上加以分辨。

VC6.使用的CRT库的DLL版本在MSVCRT.DLL中实现, 对应调试版本为MSVCRTD.LIB。

VC2005使用的CRT库的DLL版本在MSVCR80.DLL中实现,对应调试版本为MSVCR80.DLL。

VC2008使用的CRT库的DLL版本在MSVCR90.DLL中实现,对应调试版本为MSVCR90D.DLL。

VC2010使用的CRT库的DLL版本在MSVCR100.DLL中实现,对应调试版本为MSVCR100D.DLL。

静态运行时库(MT/MTd)

静态运行时库(release版)对应的主要文件包括:

LIBC.LIB(Single thread static library, retail version)

LIBCMT.LIB(Multithread static library, retail version)

不同编译器实现的库名都相同,都为libcmt.lib,调试版为libcmtd.lib。

C++标准库

对于C++标准库中的IO流和STL,VC6.0、VC2005、VC2008和VC2010也提供了DLL版本和LIB版本。

LIB版均实现在libcpmt.lib中,对应的调试版本为libcpmtd.lib。

不同版本的编译器实现的DLL也不相同。

  VC6.使用的C++类库的 DLL版本在MSVCP60.DLL中实现, 对应调试版本为MSVCP60D.LIB。

  VC2005使用的C++类库的DLL版本在MSVCP80.DLL中实现,对应调试版本为MSVCP80.DLL。

  VC2008使用的C++类库的 DLL版本在MSVCP90.DLL中实现,对应调试版本为MSVCP90D.DLL。

  VC2010使用的C++类库的DLL版本在MSVCP100.DLL中实现,对应调试版本为MSVCP100D.DLL。

编译器中运行库设置

/MT、/MTd、/MD、/MDd各选项区别

MT选项:链接LIB版的C和C++运行库。在链接时就会在将C和C++运行时库(LIBCMT.LIB、LIBC.LIB)集成到程序中,程序体积会变大。

MTd选项:LIB的调试版。

MD选项:使用DLL版的C和C++运行库,这样在程序运行时会动态的加载对应的DLL,程序体积会减小,缺点是在系统没有对应DLL时程序无法运行(需添加MSVCPxx.DLL、MSVCRxx.DLL)。

MDd选项:表示使用DLL的调试版。

带T的链接静态库lib;带D链接动态库dll;带d为调试版本,库名加d

如何选择运行库

先看几个错误:

error LNK2038

image.png

error LNK2005

image.png

当引用的库和当前项目设置的运行库不一致时,会出现error LNK2038: 检测到“RuntimeLibrary”的不匹配项…

当引用的库或当前的库有一个使用/MT时,会出现error LNK2005:…

所以若当前VC项目不引用其他VC项目,则可以使用任意一种运行库选项;若需要引用其他VC项目,则所有的项目都需设置运行库选项为/MD或/MDd。

老程序缺DLL?Visual C++ 2010 Express与运行库排查实战 在Windows平台上,C++程序的运行离不开对应的运行库,而Visual C++ Redistributable正是保证程序能调用C运行时组件的关键。不同版本的编译器生成的可执行文件,依赖不同的CRT动态链接库,如VC++ 2010对应MSVCR100.dll,一旦缺失或位架构不匹配,就会出现“缺少MSVCR100.dll”或“0xc000007b”等经典错误。理解这些运行库的安装原理,对于排查老旧软件无法启动、开发环境编译失败等问题极有价值。无论是网上下载老压缩包安装Visual C++ 2010 Ex 阅读详情

相关推荐

PowerBuilder编译DLL报错EN32T.H缺失?这份排查指南请收好

动态链接库(DLL)是Windows平台实现代码复用的经典机制,PowerBuilder(PB)作为企业级开发工具,也能通过编译将业务对象封装为DLL供其他语言调用。然而这一过程远非“点几下”那么简单,PB生成的C++胶水代码需要依赖一系列模板头文件,其中EN32T.H正是编译链路中最关键的一环。该头文件用于声明PB与C++之间的类型映射和导出接口,若Include路径未配置或版本不匹配,编译器会直接报出C1083错误,中断整个构建。本文从DLL封装原理出发,讲解EN32T.H的来源、验证方法及includ

weixin_26850069的博客 360

使用vs编译无dll依赖的c++程序

文章目录一、问题详情二、解决方案三、原理1. 基本概念(MT、MTd、MD、MDd)2. 静态库/动态库3. 注意事项 一、问题详情   使用 visual studio 完成 C++ 的代码编写后,编译成可执行程序,会遇到编译后,在其他设备上报缺乏dll错误导致程序无法运行的情况,下面先介绍解决方法,再对其原理进行简单描述。 二、解决方案   项目 -> 属性 -> 配置属性 -> C/C+±代码生成 -> 运行库 -> 多线程 (/MT)   截图如下: 三、原理 1.

小爱玄策 2862

Visual C++运行库详解与常见问题解决方案

Visual C++运行库(Visual C++ Runtime Library)是Windows操作系统中支撑C++应用程序正常运行的核心组件。它由一系列动态链接库(DLL)组成,如等,提供程序运行时所需的底层函数支持,包括内存管理、异常处理、标准库函数等功能。从功能角度看,VC++运行库不仅为C++程序提供运行环境,还确保了程序与Windows系统的良好交互。

weixin_35757531的博客 6098

md /mdd /ml /mt/mtd

md /mdd /ml /mt/mtd VC编译选项 多线程(/MT)多线程调试(/MTd)多线程 DLL (/MD)多线程调试 DLL (/MDd)C 运行时库 库文件Single thread(static link...

daza6336的博客 471

百度API实现人流量数量检测(动态)

百度的这个API还挺好用的,对与不追求高精度的人来说非常适用,结合他官方给的文档,极易上手。 需要做的就是通过API Key和Secret Key获取的access_token。 然后稍微修改下代码就行,但是他给的代码并没有直接从摄像头获取视频,而是读取一个文件夹,那么就需要自己先对摄像头的输出视频进行处理。 识别结果如下,"person_num"是当前画面的人数,in是累计进入的人数,out是累计走出去的人数。 他这个有个缺点就是返回值里边并没有实时返回in和out的值,而是都是0,但是这个图片上有,图片

qq_42479987的博客 3380

UVM环境复位--stop_sequences()

在UVM验证环境中, stop_sequences是一个用于强制终止所有正在运行的 Sequence 的方法,通常用于动态控制激励生成流程。1.通过uvm_config_db传递事件和严格的同步机制,此方案符适用于复杂复位场景和动态测试控制。组件耦合:Driver 和 Sequence 不再直接依赖env,通过标准接口通信。竞争条件:确保 Driver 完成清理后再终止 Sequence。代码健壮性:使用非阻塞操作和事件监听,避免死锁。

qq_42779035的博客 3014

c++发布包去除运行时对 vcruntime140.dll 的依赖

c++发布包去除运行时对vcruntime140.dll的依赖

m0_47696151的博客 2591

ican项目四汽车零件智能测量

ican项目四汽车零件智能测量

weixin_72050316的博客 561

编译一个不依赖任何msvcrXX.dll的Windows程序

前提 本文面向Windows任意NT平台可移植方案的讨论, 如果你: 不在乎运行时大小 面向的是商业用户 那么可以不看。 Visual C++ 从Visual C++ 6以后(不包含VC6),通过Visual Studio编译的VC程序,默认都会link到msvcrXX.dll,这个DLL就是VC运行时,如果使用了MFC,还会Link...

weixin_34281477的博客 1204

Android功耗系列专题理论之六:外设功耗问题分析方法

本文介绍了移动设备功耗问题的分析方法,重点针对传感器和GPU两大模块。传感器部分详细讲解了通过ADB命令获取日志、状态差异分析和单传感器隔离测试的排查方法,并给出优化建议。GPU部分从基础功耗测量、场景测试到功能模块拆解进行多维度分析。同时阐述了GNSS/GPS功耗的测试方法,包括前后台对比、星座双频拆解及SAP/DPO等特殊功能的电流分析,为移动设备功耗优化提供系统性的诊断思路。

373

Linux故障排查和性能优化面试题及参考答案

在 Linux 系统中,负载(Load Average)是衡量系统繁忙程度的一个重要指标,它表示系统在特定时间间隔内运行队列中的平均进程数。负载值反映了系统当前的工作压力,主要包括 CPU 等待运行的进程数量和处于不可中断睡眠状态(通常是等待 I/O 操作完成)的进程数量。负载平均值通常有三个数值,分别代表过去 1 分钟、5 分钟和 15 分钟内的系统平均负载。例如,在使用uptime命令或查看文件时,会看到类似这样的输出,这三个数值依次表示过去 1 分钟、5 分钟和 15 分钟的负载平均值。

大模型大数据攻城狮的专栏 1082

c#调用c++编译的dll的移植问题

c++编译dll 编译dll有详细的文章介绍,这里主要是介绍c#调用dll出现的一系列的问题。方便说明这里简单介绍编译dll,主要介绍自己编译的dll在自己的电脑上运行的很好,移植就出现各种问题。 新建项目 选择 Win32 项目 输入项目名称 确定 选择下一步 再选择dll和空项目 完成即可。 之后新建两个文件这里用加法举例,直接上代码: add.h extern "C" ...

Mr.小艾 969

Ubuntu上通过FinalShell或Asbru访问CentOS虚拟机

使用FinalShell或Asbru远程连接虚拟机

howard2005的专栏 2279

让VC编译出来的程序不依赖于msvcr80.dll/msvcr90.dll/msvcr100.dll等文件

---转载:http://hi.baidu.com/liu_haitao/item/e2157ac3a3c32a0bc610b253 让VC编译出来的程序不依赖于msvcr80.dll/msvcr90.dll/msvcr100.dll等文件          正常情况下,当我们用VC编译出一个Console/Win32类型项目的exe程序时(这里暂不考虑MFC程序),会依赖于msvcrxx.dl...

weixin_34327761的博客 144

数据分享】中国12.5m数字高程模型(DEM)数据(分省)

数据名称:ALOS 12.5m DEM 数据。数据名称:ALOS 12.5m DEM 数据。数据大小:61.5GB。空间分辨率:12.5m。数据大小:61.5GB。空间分辨率:12.5m。

JData_Engineer的博客 5388

Open3D 计算点云基本特征

在 Open3D 中,可以通过 PCA(主成分分析)来求得点云的特征值和特征向量。然后基于这些特征值,进一步计算各种几何特征,如线性、平面性、球度等。

纵马踏花向自由 1606

VC编译DLL时,如何不依赖VC运行库

用VC编译的DLL如果依赖VC运行库,分发时如果目标系统不带对应版本的VC支行库,将导致DLl调用失败,在编译时应设置不依赖VC运行库: 在C/C++/Code Generation的Runtime Library中选择Multi-threaded(/MT)  Release配置或Multi-threaded Debug(/MTd) Debug配置就可以编译出不依赖VC运行库的DLL了。

编程小战 6217

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

用VS编译出不依赖VC运行库的可独立运行的程序

用VS编译出不依赖VC运行库的可独立运行的程序

qq_43685425的博客 5785

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

封装cpp-httplib成dll包,为老项目提供http网络支持

公司内某些老的项目不支持https或者http1.1的一些新功能,需要开发对应的SDK供其调用,以便维护老项目。

weixin_55229531的博客 5万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

你所不知道的C和C++运行库

C和C++运行库中介绍,主要是项目属性-C/C++-代码生成-运行库 中几个选项/MD、/MDd、/MT、/MTd的介绍。

duiwangxiaomi的博客 1604

[C-C++]你所不知道的C和C++运行库

原创文章,欢迎转载。转载请注明:转载自 祥的博客 文章目录@[toc]从C和C++运行库说起VC++在何处实现C和C++运行库动态版(DLL)和静态版(LIB)C和C++运行库的优缺点 原文:你所不知道的C和C++运行库 转载后只做了格式上的编辑,原文如下: 周五晚,小雨,少见的未加班。无聊,遂准备写一篇博客,介绍一下C和C++运行库,只因发现工作几年的人对此一知半解的大有人在。     ...

祥的专栏 1263

C/C++运行库简介

什么是C/C++运行库 任何一个C 程序,它的背后都有一套庞大的代码来进行支撑,以使得该程序能够正常运行。这套代码至少包括入口函数,及其所依赖的函数所构成的函数集合。另外包括各种标准库函数的实现。 这样的一个代码集合称之为运行时库(Runtime Library),C 语言的运行时库,称为 C 运行库(CRT)。 C 运行库大致包含的功能: 1. 启动与退出函数 2. 由C 语言标准规定的C 语言标准库所拥有的函数实现。 3. I/O 功能的封装与实现。 4. 堆的封装和实现 5. 语言中一些特殊功能的实现

weixin_45239587的博客 1万+

Visual C++运行库修复工具:彻底解决DLL依赖故障的全方位方案

当启动专业设计软件时弹出"无法定位程序输入点于MSVCR120.dll",开发工具编译项目提示"缺少vcruntime140_1.dll",或财务软件在报表生成时突然崩溃——这些故障背后都指向同一个系统基础设施组件:Visual C++运行库。作为支撑超过80% Windows应用的"系统通用语言",这些动态链接库的健康状态直接决定了软件生态的稳定性。本文将通过"问题溯源-工具实战-场景适配-体系

gitblog_00521的博客 413

C++运行库入门:从零开始理解依赖管理

运行库是一组预先编译好的函数和资源的集合,包含了程序运行时需要调用的基础功能。比如处理输入输出、内存管理、数学运算等。它就像是一个工具箱,让我们不用重复造轮子。

EmeraldWolf23的博客 639

解决pyzbar依赖缺失:从FileNotFoundError到Visual C++运行库的全面排查

本文详细解析了pyzbar依赖缺失问题,特别是FileNotFoundError和libzbar-64.dll缺失的解决方案。从Visual C++运行库安装到手动补全DLL文件,提供了五种实测有效的解决方法,并分享了预防措施与最佳实践,帮助开发者彻底解决pyzbar环境配置难题。

weixin_27972919的博客 339
上一篇: 将JS代码隐藏在图片中的方法
下一篇: 如何编译生成dll文件以及如何调用dll文件
biyusr
博客等级 码龄18年 4949粉丝 1585原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值