【问题标题】:How to resolve "symbol lookup error" on .NET Core on Linux如何解决 Linux 上 .NET Core 上的“符号查找错误”
【发布时间】:2021-07-29 16:48:43
【问题描述】:

使用 Visual Studio,创建用于 Linux 的 .NET Core 3.1 C# DLL。 在Linux“dotnet MyApplication.dll”上,触发System.DllNotFoundException,但问题似乎是六个“符号查找错误”:

3139: /usr/lib64/libicuuc.so.60: error: symbol lookup error: undefined symbol: u_strlen (fatal)
3139: /usr/lib64/dotnet/shared/Microsoft.NETCore.App/3.1.11/System.Globalization.Native.so: error: symbol lookup error: undefined symbol: GlobalizationNative_CompareStringW (fatal)
3139: /usr/lib64/dotnet/shared/Microsoft.NETCore.App/3.1.11/System.Globalization.Native.so: error: symbol lookup error: undefined symbol: GlobalizationNative_GetDefaultLocaleNameW (fatal)
3139: /usr/lib64/dotnet/shared/Microsoft.NETCore.App/3.1.11/System.Globalization.Native.so: error: symbol lookup error: undefined symbol: GlobalizationNative_GetLocaleNameW (fatal)
3139: /usr/lib64/dotnet/shared/Microsoft.NETCore.App/3.1.11/System.Globalization.Native.so: error: symbol lookup error: undefined symbol: GlobalizationNative_GetLocaleInfoStringW (fatal)
3139: /usr/lib64/libplmwdm-c.so: error: symbol lookup error: undefined symbol: protobuf_c_empty_string (fatal)

如何解决这些“符号查找错误”? 其中四个与 .NET Core 相关。

  • u_strlen (Unicode strlen) 与 libicuuc.so.60 相关,但 libicuuc.so.60 已解析并加载成功。
  • protobuf_c_empty 字符串与我安装的多个 protobuf RPM 之一相关,所有“.so”文件都存在于本地目录中。
  • 这六种方法都没有被我的小应用程序直接引用,但我确实引用了客户库 libplmwtss-c.so 中的一种方法,而且毫无疑问,libplmwtss-c.so 会触发所有其他引用。
  • LIB_DEBUG=all 表示 libplmwtss-c.so 已解决并加载没有问题,许多其他“.so”文件已解决并加载没有问题,但这六个问题参考仍然存在。

【问题讨论】:

  • 这是 RHEL 8,对吧?您能否分享有关如何使用 Visual Studio 创建 DLL 的更多信息?如果您使用命令行dotnet publish 命令,您能否重现该问题?如果你使用一个简单的“hello-world”风格的程序并尝试运行它,你能重现任何问题吗?您能否分享在每个产生符号错误的.so 文件上运行ldd 的输出?
  • 不是 RHEL 8,而是 Centos8。使用 VS2019,依次单击文件、新建项目、C# 控制台应用程序、目标框架 .NET Core 3.1。让 Centos8 在 VirtualBox 下运行。一个简单的“Hello World”工作,即“dotnet HelloWorld.dll”确实打印出“hello world”。但后来我添加了一个“libplmwtss-c”的 DllImport,并在该点中添加了一个方法,调用该方法会导致错误。恐怕 LD_DEBUG=all 输出是 7MB。这是 OneDrive 链接1drv.ms/t/s!ArFHTzWIP6DTgxUn48uWyvv2BNlB?e=twzgqa
  • 谢谢。 libplmwdm-c.so 可以公开访问吗?有什么办法可以得到那个副本? yum install protobuf-devel 有帮助吗?
  • 这恐怕是客户机密。使用“readelf -a”,我验证了“u_strlen”在 lilbicuuc.so 中,LD_DEBUG=all 清楚地表明已找到并加载没有问题。我怀疑其他五个未解决的符号也是如此。如果 "u_strlen" 在 libicuuc.so 中,并且 libicuuc.so 加载没有问题,为什么加载时抱怨 "u_strlen" 未解析?
  • 我建议关注 DllNotFoundException 中提到的错误。那只是 libplmwtss-c.so,对吧?其余的可能是红鲱鱼。你能分享ldd libplmwtss-c.so的输出吗?

标签: c# linux .net-core


【解决方案1】:

我也遇到了同样的错误,还有其他错误。我通过安装所有缺少的库来解决它们。这是我的 Docker 文件:

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-bionic AS base

ENV TZ=Europe/Bucharest
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

RUN apt-get update && apt-get install -y gnupg2
RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys Your_Missing_Key_1
RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys Your_Missing_Key_2

RUN apt-get update
RUN apt-get install -y software-properties-common
RUN add-apt-repository 'deb http://deb.debian.org/debian sid main'
RUN apt-get update

RUN apt-get install -y cups
RUN apt-get install -y libc6-dev 
RUN apt-get install -y libgdiplus
RUN apt-get install -y libicu-dev libharfbuzz0b libfontconfig1 libfreetype6
RUN apt-get install -y libpango-1.0-0
RUN apt-get install -y libpangocairo-1.0
RUN apt-get update

我还在这里提出了 dotnet/runtime github 的票: https://github.com/dotnet/runtime/issues/52696

【讨论】:

  • Andrei,谢谢,但我使用的是 CentOS8 而不是 Debian [或 Ubuntu]。使用 CentOS8 “yum”,我发现 “cups” 和 “gnopg2” 已经安装,“libgdiplus” 可以安装但以上所有其他项目报告“无法找到匹配”。看看你的 GitHub 链接看起来你有非常相似问题、u_strlen、GlobalizationNative_xxx 等
猜你喜欢
  • 2020-10-21
  • 2018-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-15
  • 1970-01-01
  • 2017-09-19
相关资源
最近更新 更多