混合调试和发布库:Windows与Linux,静态与共享

时间:2019-04-19 12:38:50

标签: c++ linux windows linker

已经a few times提出了这个问题,但是我观察到它总是指Windows。鉴于MSVC失败并出现以下错误,这是有道理的:

  

错误LNK2038:检测到'_ITERATOR_DEBUG_LEVEL'的不匹配:值'0'与main.obj中的值'2'不匹配

在我看来,在Linux上,它不会在构建时失败。

答案提到了构建类型之间的不同C ++运行时,并且没有在此类库之间共享CRT资源。不过,我仍不清楚在Linux / Windows和共享/静态库中这种行为有何不同。

我想更好地理解这一点。问题可能是:

  1. Windows和Linux之间有区别吗?
  2. 如果这也是Linux中未定义的行为,那么为什么它在构建时不会失败?
  3. 静态库和共享库之间有区别吗?
  4. 我的Linux软件包管理器是否下载所有dev软件包的调试版本?在usr/lib/中,我似乎找不到那里的发布和调试库...

1 个答案:

答案 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。您会看到那些生成不兼容对象的对象对其发出警告。