SkiaSharp を使用したアプリケーションを .NET Core 2.0 で作っています。
macOS では期待通り動作したのですが、 Ubuntu へ持っていって dotnet run
すると、次のエラーが発生しました。
このエラーを解決する方法が知りたいです。
発生している問題・エラーメッセージ
Unhandled Exception: System.TypeInitializationException: The type initializer for 'SkiaSharp.SKImageInfo' threw an exception. ---> System.DllNotFoundException: Unable to load shared library 'libSkiaSharp' or one of its dependencies. In order to help diagnose loading problems, consider setting the LD_DEBUG environment variable: liblibSkiaSharp: cannot open shared object file: No such file or directory at SkiaSharp.SkiaApi.sk_colortype_get_default_8888() at SkiaSharp.SKImageInfo..cctor() --- End of inner exception stack trace --- at SkiaSharp.SKBitmap..ctor(Int32 width, Int32 height, Boolean isOpaque) at SkiaSample01.Program.Main(String[] args) in /work/SkiaSample01/SkiaSample01/Program.cs:line 12
該当のソースコード
プログラムはごく単純なもので、次のように SKBitmap
を使って 100x100 のビットマップを生成しようとしています。
Program.cs
csharp
1using System; 2using SkiaSharp; 3 4namespace SkiaSample01 5{ 6 class Program 7 { 8 static void Main(string[] args) 9 { 10 Console.WriteLine("Hello SkiaSharp!"); 11 using (var bitmap = new SKBitmap(100, 100, false)) { } 12 Console.WriteLine("Bye SkiaSharp!"); 13 } 14 } 15}
SkiaSample01.csproj
xml
1<Project Sdk="Microsoft.NET.Sdk"> 2 3 <PropertyGroup> 4 <OutputType>Exe</OutputType> 5 <TargetFramework>netcoreapp2.0</TargetFramework> 6 </PropertyGroup> 7 8 <ItemGroup> 9 <PackageReference Include="SkiaSharp" Version="1.60.1" /> 10 <PackageReference Include="Avalonia.Skia.Linux.Natives" Version="1.60.0.1" /> 11 </ItemGroup> 12</Project>
試したこと
には、 "Linux 用の libSkiaSharp
は SkiaSharp には付属しないから、 Avalonia.Skia.Linux.Natives を別途入れるとよい" というような情報があったので、上記 SkiaSample01.csproj
のように追加してみましたが、現象は変わりませんでした。
dotnet publish
して出力された publish
ディレクトリには、runtimes/linux-x64/native/libSkiaSharp.so
が新たに追加されていましたが、 dotnet SkiaSample01.dll
としても同じエラーでした。
また、
から libSkiaSharp.so
をダウンロードし、 bin/Debug/netcoreapp2.0
に配置してみましたが、現象は変わりませんでした。
追記 6.24
@yamachu さん、 @espresso3389 さんに回答いただいて、次のことを試しました。
export LD_LIBRARY_PATH=/work/lib/
を設定- 上記ディレクトリに
libSkiaSharp.so
,liblibSkiaSharp.so
を配置 dotnet run
を実行
するとやはり同じエラーだったので、
LD_DEBUG=libs dotnet run
を実行してみました。
その出力には、
1946: find library=libSkiaSharp.so [0]; searching 1946: search path=/work/lib (LD_LIBRARY_PATH) 1946: trying file=/work/lib/libSkiaSharp.so 1946: 1946: find library=liblibSkiaSharp.so [0]; searching 1946: search path=/work/lib (LD_LIBRARY_PATH) 1946: trying file=/work/lib/liblibSkiaSharp.so
という内容があり、配置したファイルを探索してはいるようですが、症状は変わらずという状態です。
libSkiaSharp.so
が依存している何かが足りないのかな?とも考えています。
補足情報
- 試した Ubuntu 環境: Docker: microsoft/dotnet の
microsoft/dotnet:2.1-sdk
イメージ
参考:docker-compose.yml
yaml
1version: "3" 2 3services: 4 netcore: 5 image: microsoft/dotnet:2.1-sdk 6 volumes: 7 - ./work:/work 8 command: /bin/bash 9 tty: true
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。