Linux 中对应的库为 Visual Studio 中的 /MTd 是啥?

Posted

技术标签:

【中文标题】Linux 中对应的库为 Visual Studio 中的 /MTd 是啥?【英文标题】:What's the corresponding library in Linux as /MTd in Visual Studio?Linux 中对应的库为 Visual Studio 中的 /MTd 是什么? 【发布时间】:2016-03-31 13:19:12 【问题描述】:

问题来了: 我在 Windows 上写了一段代码。当使用/MT 选项时,答案是错误的。当简单切换到/MTd时,答案是正确的。 现在我正在移植将此代码移植到 Linux。使用以下命令答案是错误的:g++ -Ofast -o test test.cpp。另外,我很确定这是唯一剩下的问题。 我已经安装了libc6libc6-dbglibc6-devlibstdc++-4.8-devlibstdc++6libstdc++6-4.8-dbg。 这种情况有什么问题,我该如何解决?

更新:问题已解决。代码可以通过各种优化选项在 Windows(调试和发布模式)和 Linux 上正确运行。存在变量初始化问题。谢谢大家。

【问题讨论】:

这是我第一次看到porting 被称为transplanting。让我吃惊的好工作:) 如果要构建程序的调试版本,请在使用gccg++ 构建时添加-g 标志。就是这样。 @JoachimPileborg,然而,这不是问题的本质。 ***.com/questions/312312/… 那是因为您遇到的问题出在代码中,与标志无关。拥有调试信息(当您使用-g 标志时生成)将帮助您调试应用程序,方法是使用调试器并单步执行代码,或者使用诸如Valgrind 之类的工具来查找程序中的内存覆盖.除了这么说,没有任何代码我们也无能为力,最好是Minimal, Complete, and Verifiable Example。 【参考方案1】:

您需要修复您的代码。程序的行为与 C++ 运行时库的调试和发布版本不同(这是由 /MT 和 /MTd 控制的)意味着您在 您的 程序中存在错误。很可能是未定义的行为。

首先将编译命令更改为g++ -O3 -Werror -Wall -Wextra -pedantic -o test test.cpp 并研究编译器输出。如果幸运的话,您会看到一些警告变成了错误。

【讨论】:

【参考方案2】:

你有两个问题。

    您的 g++ 编译命令是发布模式。使用-g 选项使用调试符号进行编译。

    您需要解决在 Windows 上使用 /MT 在发布模式下无法获得正确信息的原因。

【讨论】:

以上是关于Linux 中对应的库为 Visual Studio 中的 /MTd 是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Visual c++ 中处理 SEHException?

Linux下gcc编译依赖库可能出现的系列问题以及对应解决方法(以GDAL库为例)

Linux - 共享库兼容性

使用从 OSGi 包中的库为 Kura 创建的现有插件项目

在tensorflow里使用bazel调用外部的库

maven:prfile应用示例,通过profile控制在不同的平台依赖对应的库