【发布时间】: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的输出吗?