質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

3回答

2304閲覧

SkiaSharp を使用した.NET CoreアプリをUbuntuで動かすと"Unable to load"エラー

amay077

総合スコア1075

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

0クリップ

投稿2018/06/23 13:40

編集2022/01/12 10:55

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 さんに回答いただいて、次のことを試しました。

  1. export LD_LIBRARY_PATH=/work/lib/ を設定
  2. 上記ディレクトリに libSkiaSharp.so, liblibSkiaSharp.so を配置
  3. 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/dotnetmicrosoft/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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

とりあえず、 ldconfig は実行したかどうかは確認しておきたいのと、依存関係に関しては、ldd すると依存先を見ることが出来るので確認してみてください。

ldd liblibSkiaSharp.so

投稿2018/06/23 15:51

espresso3389

総合スコア31

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

手元で試せていないのですが,ログを見ると

consider setting the LD_DEBUG environment variable: liblibSkiaSharp:

となっているのがわかると思います.
このようにlib接頭辞がついているのはshared libraryの探索パス内にDllImportに書かれたライブラリが見つからなかった場合のフォールバックだった記憶があります.
そのため

  1. LD_LIBRARY_PATH の通っている場所に libSkiaSharp.so を配置する
  2. bin/Debug/netcoreapp2.0 に liblibSkiaSharp.so という名前で配置してみる

どちらかでできる気がします.

投稿2018/06/23 14:02

yamachu

総合スコア191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amay077

2018/06/23 15:42

ありがとうございます。上に追記しましたが LD_LIBRARY_PATH を設定して、そこを探索しているようですが同じエラーになりました。依存ライブラリが何か足りないのかなとも考えています。
yamachu

2018/06/24 16:44 編集

おっしゃる通り依存ライブラリが足りないことが問題だったようです. 補足情報に書かれている`docker-compose.yml`で環境を作って試してみた結果,`libSkiaSharp.so`が依存している ``` libfreetype.so.6 libfontconfig.so.1 ``` の2つが見つかりませんでした. ``` $ apt install -y libfreetype6 $ apt install -y libfontconfig1 ``` この2つを実行し,`libSkiaSharp.so`が設置されているディレクトリに対して`LD_LIBRARY_PATH`でPATHを通した結果,実行出来たことを確認できました.
guest

0

状況は分かりませんが、単にライブラリを配置している場所が LD_LIBRARY_PATH にないのではないでしょうか。とりあえず動かすことが目的ならば、エラーメッセージにもあるとおり、 LD_DEBUG を指定することで適切に読み込めるような気がします。

投稿2018/06/23 13:53

espresso3389

総合スコア31

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amay077

2018/06/23 15:42

ありがとうございます。上に追記しましたが LD_LIBRARY_PATH を設定して、そこを探索しているようですが同じエラーになりました。依存ライブラリが何か足りないのかなとも考えています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問