更改运行时库选项对运行时链接的影响

     2023-02-22     167

关键词:

【中文标题】更改运行时库选项对运行时链接的影响【英文标题】:Effect of Changing Runtime Library Option on Runtime Linkage 【发布时间】:2016-08-21 21:08:40 【问题描述】:

Microsoft Visual Studio 2015 (v14.0) 我有一个包含 3 个项目的解决方案。

其中两个项目是 DLL,另一个是可执行文件。 可执行文件在运行时加载 DLL 并调用它们的函数并交换参数;使用 Window 的 LoadLibraryGetProcAddress API。

Release 模式下,当我将我的项目的Runtime Library 设置为Multi-threaded DLL 时,一切正常。这是Multi-threaded Debug DLL 用于Debug 模式。

如果我将Release 更改为Multi-threaded 或将Debug 更改为Multi-threaded Debug,我开始收到调试断言错误或内存访问冲突错误和其他类型的错误。 (当我更改它时,我会为解决方案中的所有项目更改它。)

我需要使用Multi-threaded 选项,这样可执行文件就不需要目标机器上的C++ 运行时库。我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

这是因为使用/MT 将实体的运行时(即 DLL 和可执行文件)分开,每个实体都有自己的运行时,因此有自己的堆,试图在一个中分配内存并在另一个中释放它最终会出错.因为其他模块不知道分配的内存。 另一方面,/MD 所有模块共享相同的运行时,并且运行时知道其中一个分配的内存,它将能够在另一个中释放它。因为一个运行时实例管理着整​​个内存。

编辑: 感谢 dxiv 评论。

【讨论】:

您所写的内容存在一些误解。地址空间是每个进程的,DLL总是与加载它们的进程以及由同一进程加载的其他 DLL 共享相同的地址空间。从同一进程中的任何其他位置访问在一个 DLL 函数中分配的内存是完全安全的。 not/MT 一起工作的是在一个DLL 的代码中分配内存(new),然后在另一个DLL 的代码中释放它(delete),因为/MT 每个DLL有自己的静态链接 CRT 副本。参见例如this answer。 @dxiv 你说得对,谢谢你的评论。我修改了答案。

运行时库只是一些动态链接的库文件吗? [关闭]

】运行时库只是一些动态链接的库文件吗?[关闭]【英文标题】:IStheruntimelibraryjustsomedynamiclylinkedlibraryfiles?[closed]【发布时间】:2015-05-1721:34:34【问题描述】:例如,C标准库有一些标准函数,例如printf,.标准库和运行时库到底是... 查看详情

错误 MSB8024:不支持使用静态版本的 C++ 运行时库

】错误MSB8024:不支持使用静态版本的C++运行时库【英文标题】:errorMSB8024:UsingstaticversionoftheC++runtimelibraryisnotsupported【发布时间】:2018-06-0118:45:19【问题描述】:我使用VisualStudio模板创建了简单的Windows运行时组件。默认情况下,... 查看详情

夏令时规则更改是不是使 C 运行时库无效?

】夏令时规则更改是不是使C运行时库无效?【英文标题】:HasthedaylightsavingsrulechangeinvalidatedtheCruntimelibrary?夏令时规则更改是否使C运行时库无效?【发布时间】:2010-09-2112:22:43【问题描述】:前段时间,我整理了一个基于时间的... 查看详情

链接脚本在编程中的高级运用之二——运行时库和c++特性支持

...现可变长数组。本章在前者的基础上继续讲述链接脚本在运行时库中的高级应用技巧,以及编译器如何支持类对象的构造和析构函数。本章的应用原则上类似于可变长数组,但本章更加侧重讲述运行时库的实现原理,... 查看详情

如何在调试构建期间使 Visual Studio (2019/2022) 链接到正常的运行时库?

】如何在调试构建期间使VisualStudio(2019/2022)链接到正常的运行时库?【英文标题】:HowtomakeVisualStudio(2019/2022)linktothenormalruntimelibrariesduringadebugbuild?【发布时间】:2021-11-3013:32:03【问题描述】:我想这样做的原因是调试库中充斥着... 查看详情

如何在vc++中判断计算机是不是安装c运行时库

...置为使用静态链接库了,这样即使没有安装VC的机器也可以运行你的程序了.另外说一下Debug和Release版本的不同,他们主要的不同点就在于Debug版本生成的exe中包含很多调试信息,Release版本没包含,并且,Release版本的代码是作了编译优化... 查看详情

一文带你弄懂visualstudio:运行时库及mt/mtdmd/mdd(代码片段)

一文带你弄懂VisualStudio:运行时库及MT/MTD、MD/MDD引子什么是RuntimeLibrary?RuntimeLibrary和运行库MTMTDMDMDD的关系静态链接的多线程库动态链接的运行时库MDD、MTD和MD、MT开发时注意事项1.在多工程开发时,所有的工程使用同... 查看详情

/MD 和 /MT 运行时库之间的编组

...描述】:我有第三方库,分别编译为/MTd和/MT。这些无法更改。我正在使用MTdll使用它们。我如何跨越边界进入/MDdll领域以满足/CLI的要求并希望从C#调用这些第三方库?【问题讨论】:【参考方案1】:相当简单:COM风格。也就是... 查看详情

WinCE C/C++ 运行时库下如何检测泄漏?

】WinCEC/C++运行时库下如何检测泄漏?【英文标题】:HowtodetectleaksunderWinCEC/C+runtimelibrary?【发布时间】:2008-12-2301:41:31【问题描述】:我知道使用crtdbg.h标头对Win32进行基本泄漏检测的可能性,但是CECRT库标头中不提供此标头(我... 查看详情

Visual Studio 2015:在没有运行时库的情况下编译 C/C++

】VisualStudio2015:在没有运行时库的情况下编译C/C++【英文标题】:VisualStudio2015:CompileC/C++withoutaruntimelibrary【发布时间】:2016-08-3000:44:44【问题描述】:有没有一种不用任何运行时库就可以用VisualStudio2015编译C/C++的方法?我需要在... 查看详情

在运行时更改 TabBar 中的选项卡

】在运行时更改TabBar中的选项卡【英文标题】:ChangeTabinTabBaratruntime【发布时间】:2017-01-0312:37:41【问题描述】:我正在尝试动态更改Tabbar中的选项卡。我为UITabBarController添加了一个类。在第一个选项卡控制器中,我放置了一个... 查看详情

Visual Studio 2010 运行时库

】VisualStudio2010运行时库【英文标题】:VisualStudio2010RuntimeLibraries【发布时间】:2012-10-0912:12:55【问题描述】:我编写了一个许多用户会在他们的计算机上使用的工具。但是我注意到,没有安装VisualStudio的用户无法打开我的可执行... 查看详情

-wl,-rpath=

...h大体就以下这几个意思:  1.添加一个文件夹作为运行时库的搜索路径。在将ELF可执行文件与共享对象链接时使用此选项;  2.在链接时,一些动态库明确的链接了其他动态库,则-rpath选项也可用于定位这些链接的... 查看详情

Visual Studio 2010 的 Visual C++ 2012 运行时库先决条件

】VisualStudio2010的VisualC++2012运行时库先决条件【英文标题】:VisualC++2012RuntimeLibraryprerequisiteforVisualStudio2010【发布时间】:2014-07-3109:57:31【问题描述】:我目前正在使用VisualStudio2010Professional,我想知道是否有任何方法可以将VisualC+... 查看详情

vc运行时库(/md/mt等)

 /MT运行时库http://www.cnblogs.com/kex1n/archive/2013/04/02/2995791.htmlhttp://blog.csdn.net/lyq240919525/article/details/40402909 我的工程是VS2010的控制台程序,要用到一个VS2008的库。结果release下没有任何问题,到了debug下会提示应用程 查看详情

运行时库以及静态库,动态库之间的关系

...或者LIBCMT.LIB打包进可执行程序,而MD则告诉可执行程序,运行的时候调用msvcrt.dll,因此任何一个工程只能选择运行时库中的一种方式,MD,MDd,MT,MTd,这四种方式的一种,连接C库,不管是一个静态库,还是一个动态库,还是一个可... 查看详情

标准库还需要额外的运行时库吗? (vcruntime140_1.dll)

】标准库还需要额外的运行时库吗?(vcruntime140_1.dll)【英文标题】:Standardlibrariesstillrequireadditionalruntimelibs?(vcruntime140_1.dll)【发布时间】:2020-06-2410:04:35【问题描述】:我使用标准头文件和DirectX(见下文)创建了一个Windowsx64程序... 查看详情

下一代vc运行时库——universalcrt

前言其实theUniversalCRT(通用C运行时库)已经不能算是“下一代”,因为它已经在前两年伴随着VisualStudio2015和Windows10发布。但是由于之前使用VS2015开发的应用还较少,关注的人也少,相关的文章更少。所以笔者... 查看详情