c++ - 强制 lld 链接在不同 DWARF 版本中使用调试信息的可重定位文件

标签 c++ android-ndk linker clang llvm

有一个项目有一个预构建的依赖项(一堆静态库),所有这些库都有以默认工具链格式生成的调试信息部分 - DWARF-4。我正在尝试使用 -gdwarf-5 编译我的源代码,但链接器无法链接最终的可加载二进制文件:

ld.lld: error: linking module flags 'Dwarf Version': IDs have conflicting values ('i32 4' from foo/bar/baz.cc with 'i32 5' from ld-temp.o)

即使不同的 TU 使用不同的 DWARF 版本,有什么方法可以说服链接器继续?经过一番谷歌搜索后,我找到了这张票 https://reviews.llvm.org/D52952 ,同样的问题被报告为警告,这让我觉得可能有一些机会来压制它。

附言以上是关于 Android NDK r20(声称是 LLVM 8)的 LLVM 工具链,链接器是 lld。

附言我没有机会重新编译依赖项,这就是为什么我正在寻找一种方法来允许在最终二进制文件中使用不同的 DWARF 版本。

最佳答案

NDK 默认将 -Wl,--fatal-warnings 传递给链接器,因为最常见的链接器警告类型是未定义某些内容,这意味着您的应用已损坏。多年来,链接器中添加了更多警告,其中一些(我相信这里就是这种情况)相当无害。

不幸的是,据我所知,没有办法像使用编译器使用 -Werror=warning-name 那样在每次警告的基础上控制致命警告。如果您可以禁用 所有 致命链接器警告,则可以使用 -Wl,--no-fatal-warnings 禁用该功能(将其添加到您的 ldflags ).如果您使用的是 ndk-build,则可以使用 LOCAL_DISABLE_FATAL_LINKER_WARNINGS := true 在每个模块的基础上执行此操作。

关于c++ - 强制 lld 链接在不同 DWARF 版本中使用调试信息的可重定位文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58633287/

相关文章:

c++ - 带节点删除函数的链表问题

android - wcstombs() 在 Android 上有无效的输出

android - 即使在 CMake 中构建 Release 时,也会在最终 SO 文件中获取调试符号

c++ - 我可以在 C++11 中创建静态库并从 C++03 调用它吗?

c++ - 如何在 Ubuntu 的共享库中列出导出的函数

c++ - 使用 CMake 和 C++ 运行 mysql-connector?

c++ - 主函数外的新运算符 - C++

c++ - 模板类中的模板函数

gcc - 如何知道ndk-build的gcc优化级别

c++ - 使用 MSVC2010 在动态 QT 中使用 RegOpenKey 和 RegEnumKey