c++ - VS 2010 应用程序需要安装 VS 运行时 - 如何避免这种情况?

标签 c++ visual-studio-2010 dll runtime

我在 VS C++ 2010 Express Edition 中编写了一个应用程序,它包含一些 DLL 并且还依赖于一些第三方 DLL。 应用程序本身是一个 DLL。

事实证明,要使其在另一台机器上运行,用户必须安装 VS 2010 可再发行运行时。

我尝试使用标志/MT 而不是/MD 来构建我的 DLL - 我相信这意味着我想要静态链接。但是,在这种情况下,我遇到了关于 MSCVRT.lib 的“多重定义”错误。错误消息还建议使用标志/NODEFAULTLIB:msvcrt.lib 来避免这种情况。但是,使用这些设置我的应用程序仍然需要运行时安装。

有人可以解释一下如何避免这种情况吗?

谢谢, 罗布斯塔

更新:如果我只是使用/MT 标志而不是/MD,我会收到以下错误

MSVCRT.lib(ti_inst.obj):错误 LNK2005:“private:__thiscall type_info::type_info(class type_info const &)”(??0type_info@@AAE@ABV0@@Z) 已在 LIBCMT 中定义.lib(打字信息.obj) MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)"(??4type_info@@AAEAAV0@ABV0@@Z) 已经在 LIBCMT.lib 中定义(打字信息.obj) 创建库 C:\MyApp\Release\MyApp.lib 和对象 C:\MyApp\Release\MyApp.exp LINK:警告 LNK4098:默认库“MSVCRT”与其他库的使用冲突;使用/NODEFAULTLIB:库 C:\MyApp\Release\MyApp.dll: fatal error LNK1169:找到一个或多个多重定义的符号

添加标志/NODEFAULTLIB:library 后我没有收到任何错误,应用程序构建成功,但仍然需要运行时安装。

我也链接的第 3 方库是否可能需要运行时?

最佳答案

您正在链接一些仍然使用/MD 编译的代码,可能是某种静态库。混合搭配是行不通的。

在使用 DLL 时使用/MT 是非常危险的。当导出的函数返回需要由客户端代码释放的指针或 C++ 对象时,您会遇到麻烦。例如返回一个 std::string。使用/MT,客户端将使用自己的堆分配器来释放内存。无法工作,DLL 使用了另一个堆。你会泄漏,很难诊断。出于同样的原因,使用由不同版本的 CRT 构建的第 3 方 DLL 也是一个问题。 MSDN Library article 中有更多详细信息.

使用 this download 部署所需的 CRT DLL 非常简单.

关于c++ - VS 2010 应用程序需要安装 VS 运行时 - 如何避免这种情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3646327/

相关文章:

c++ - 适用于各种仿函数而无需强制转换的函数包装器

c# - 删除资源字典中未使用的样式

c++ - 实时QImage

c++ - 如何修改已编译 DLL 中的函数

c# - 将 DLL 嵌入已编译的可执行文件中

c++ - 在windows上的qt项目中包含ffmpeg导致程序意外结束

c++ - 从弱指针返回类型返回共享指针

c++ - OSX 上 Boost 和 C++ 的链接器错误

c++ - boost odeint 中的受控误差步进器是否支持复杂的数据类型?

mysql - 数据库列中的文本搜索