已经a few times提出了这个问题,但是我观察到它总是指Windows。鉴于MSVC失败并出现以下错误,这是有道理的:
错误LNK2038:检测到'_ITERATOR_DEBUG_LEVEL'的不匹配:值'0'与main.obj中的值'2'不匹配
在我看来,在Linux上,它不会在构建时失败。
答案提到了构建类型之间的不同C ++运行时,并且没有在此类库之间共享CRT资源。不过,我仍不清楚在Linux / Windows和共享/静态库中这种行为有何不同。
我想更好地理解这一点。问题可能是:
usr/lib/
中,我似乎找不到那里的发布和调试库... 答案 0 :(得分:2)
是的,Linux和Windows是不同的。对于Windows,我不能说太多,但是使用Linux工具链,我们实际上并没有分离的Debug vs Release版本。
我们有几种选择:
什么构建工具链称为“发布”或“调试”,只是一组选项。例如,CMake的最小发布版本使用-Os -DNDEBUG
,而CMake的调试版本使用-g
。发行版在打包内容时还会添加其他选项。
但是除了这些选项之外,ABI都是相同的,因此它们都是兼容的(专门标记为[*]的选项除外-但在典型构建中不使用这些选项)。所以没关系。您可以混合使用“调试”或“发布”对象,这将起作用。
对于4),许多发行版都采用拆分调试符号来构建。这意味着调试信息在单独的文件中发出,并且通常独立打包。例如:
ii libc6:amd64 2.27-3ubuntu1 GNU C Library: Shared libraries
ii libc6-dbg:amd64 2.27-3ubuntu1 GNU C Library: detached debugging symbols
通常不安装第二个软件包。我手动安装了它,以完整的调试信息逐步遍历libc6。
[*]例如,请查看GCC code generation options。您会看到那些生成不兼容对象的对象对其发出警告。