【发布时间】:2019-09-09 17:36:38
【问题描述】:
afewtimes 已经有人问过这个问题,但我发现它总是指 Windows。这是有道理的,因为 MSVC 失败并出现以下错误:
错误 LNK2038:检测到“_ITERATOR_DEBUG_LEVEL”不匹配:值“0”与 main.obj 中的值“2”不匹配
在我看来,在 Linux 上,它不会在构建时失败。
答案提到构建类型之间存在不同的 C++ 运行时,并且在此类库之间不共享 CRT 资源。不过,我不清楚这种行为在 Linux/Windows 和共享/静态库中有何不同。
我想更好地理解这一点。问题可能是:
- Windows 和 Linux 有区别吗?
- 如果它也是 Linux 中未定义的行为,为什么它不会在构建时失败?
- 静态库和共享库有区别吗?
- 我的 Linux 包管理器是否下载所有开发包的调试版本?查看
usr/lib/,我似乎无法同时找到发布和调试库...
【问题讨论】:
-
如果
_ITERATOR_DEBUG_LEVEL不同,则问题从编译阶段开始,而不是链接/库阶段 -
那句话的后果是什么?这是否意味着共享库不应该成为问题?
-
对于 Windows,当调用 ITERATOR_DEBUG_LEVEL 时,编译器会从各种类(例如 STL 类)中添加/删除代码。因此,当您链接到不同的调试级别时,您可能会链接到同一类的两个或多个不同版本,因此会出现错误。
-
对。所以错误是在编译时引发的,如果没有,它会在运行时导致未定义的行为,对吧?这意味着链接永远不是问题,静态库和共享库在 Windows 中都有这个问题。对吗?
-
是的,如果模块之间的类内部结构发生了变化,将导致未定义的行为。