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

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

ただいまの
回答率

90.61%

  • C#

    6859questions

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

  • Linux

    3642questions

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

  • Ubuntu

    1315questions

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

  • .NET Framework

    447questions

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

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

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 240

amay077

score 868

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

using System;
using SkiaSharp;

namespace SkiaSample01
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello SkiaSharp!");
            using (var bitmap = new SKBitmap(100, 100, false)) { }
            Console.WriteLine("Bye SkiaSharp!");
        }
    }
}

SkiaSample01.csproj

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="SkiaSharp" Version="1.60.1" />
    <PackageReference Include="Avalonia.Skia.Linux.Natives" Version="1.60.0.1" />
  </ItemGroup>
</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.soliblibSkiaSharp.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/dotnet の microsoft/dotnet:2.1-sdk イメージ

参考:docker-compose.yml

version: "3"

services:
  netcore:
    image: microsoft/dotnet:2.1-sdk
    volumes:
      - ./work:/work
    command: /bin/bash
    tty: true
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/24 00:42

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

    キャンセル

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/24 00:42

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

    キャンセル

  • 2018/06/25 01:43 編集

    おっしゃる通り依存ライブラリが足りないことが問題だったようです.
    補足情報に書かれている`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を通した結果,実行出来たことを確認できました.

    キャンセル

0

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

ldd liblibSkiaSharp.so

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    6859questions

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

  • Linux

    3642questions

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

  • Ubuntu

    1315questions

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

  • .NET Framework

    447questions

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