docker - 'OpenCvSharp.NativeMethods' 抛出异常。无法加载共享库“OpenCvSharpExtern”或其依赖项之一。,Ubuntu 18.04
问题描述
在 Windows 环境中运行此应用程序时,我在我的 .net core 3.0 应用程序中使用了 OpenCvSharp 库,该应用程序运行时没有任何问题。当在 ubuntu 18.04 中运行的 docker 部署和托管相同的应用程序时,会发生以下异常:
System.DllNotFoundException: Unable to load shared library 'OpenCvSharpExtern' or one of its dependencies.
我已经安装了在 ubuntu 环境中运行 OpenCvSharp4 所需的以下软件包(nuget):
- OpenCvSharp4
- OpenCvSharp4.runtime.ubuntu.18.04-x64
当使用以下命令检查 libOpenCvSharpExtern.so 库的依赖关系时:
ldd libOpenCvSharpExtern.so
缺少一些依赖程序集,因此我安装了以下 GitHub 线程中提到的所有必要包,该线程报告了相同的确切问题:
https://github.com/shimat/opencvsharp/issues/889
但仍然发现一些依赖项丢失,这些程序集名称如下:
- libavcodec.so.57 => 未找到
- libavformat.so.57 => 未找到
- libavutil.so.55 => 未找到
- libswscale.so.4 => 未找到
- libjpeg.so.8 => 未找到
我还尝试安装以下软件包“libjpeg62-turbo-dev”和“libavcodec-extra57”来修复“未找到”程序集。但是问题还是出现了。
任何有关如何解决此问题的建议将不胜感激。
解决方案
我们有同样的问题。经过大量实验后,我们让它使用以下设置(Docker):
csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>netstandard2.0;net472</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="OpenCvSharp4" Version="4.4.0.20200725" />
<PackageReference Include="OpenCvSharp4.runtime.debian.10-amd64" Version="4.3.0.20200424" />
<PackageReference Include="OpenCvSharp4.runtime.win" Version="4.4.0.20200725" />
<PackageReference Include="System.Drawing.Common" Version="4.7.0" />
</ItemGroup>
</Project>
dockerfile
[...]
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
[...]
RUN apt-get update && apt-get install -y \
apt-utils \
libgdiplus \
libc6-dev \
libgtk2.0-dev \
libtbb-dev \
libatlas-base-dev \
libvorbis-dev \
libxvidcore-dev \
libopencore-amrnb-dev \
libopencore-amrwb-dev \
libavresample-dev \
x264 \
v4l-utils \
libwebp-dev \
tesseract-ocr \
libtesseract-dev \
libleptonica-dev \
libtiff-dev \
libavcodec-dev \
libavformat-dev \
libswscale-dev \
libdc1394-22-dev \
libxine2-dev \
libv4l-dev
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
[...]
不幸的是,我不完全确定许多 apt 软件包中的哪一个成功了,我很高兴它现在可以工作了;)
推荐阅读
- mysql - 如何避免在节点mysql中插入重复记录?
- reactjs - 使用 ListView 搜索输入显示为空
- jenkins - 如何从 build.gradle 提取版本到 Jenkins 管道
- xamarin - Xamarin Forms iOS 应用程序无法通过 MDM 安装(但适用于免费预配)
- python - 用于从 python 中的 mssql 获取数据的 lambda 表达式
- r - 将数据框列列表转换为有序因子
- microsoft-graph-api - 使用服务主体创建团队
- python - Keras 自定义生成器 TypeError:“NoneType”对象不可调用
- azure-devops - 为每个阶段设置时间限制
- sql - 如何使用 Invantive SQL 将文本转换为数字?