次の簡単なOpenCLアプリケーションをインストールしocl-icd-opencl-dev
て実行してみましたvadd
。
$ ./vadd
./vadd: error while loading shared libraries: libOpenCL.so.1: cannot open shared object file: No such file or directory
私はフォローしましたこれ、出力は次のとおりです(興味深い部分だけを保持しました)。
$ strace -f -v -s150 ./vadd 2>&1 | fgrep libOpenCL.so.1
...
open("/usr/lib/x86_64-linux-gnu/libOpenCL.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
...
素晴らしい...
$ ls -la /usr/lib/x86_64-linux-gnu/ | grep libOpenCL
lrwxrwxrwx 1 root root 18 Dec 18 2015 libOpenCL.so.1 -> libOpenCL.so.1.0.0
私がここで何を見逃しているのでしょうか?これはlibOpenCL.so.1
シンボリックリンクに問題がありますか?
答え1
私の場合は、いくつかのパッケージを壊しました。
まず、ファイルパッケージが正常であることを確認してください。
ls -la /usr/lib/x86_64-linux-gnu/libOpenCL*
このように赤い結果が表示された場合
lrwxrwxrwx 1 root root 18 abr 5 2017 libOpenCL.so -> libOpenCL.so.1.0.0
赤いテキストは、シンボリックリンクが失われ、ターゲットが欠落していることを示します。その後、再インストールする必要があります。
早く走る
sudo apt --reinstall install ocl-icd-libopencl1
それからやり直してください
ls -la /usr/lib/x86_64-linux-gnu/libOpenCL*
lrwxrwxrwx 1 root root 18 abr 5 2017 /usr/lib/x86_64-linux-gnu/libOpenCL.so -> libOpenCL.so.1.0.0
lrwxrwxrwx 1 root root 18 abr 5 2017 /usr/lib/x86_64-linux-gnu/libOpenCL.so.1 -> libOpenCL.so.1.0.0
-rw-r--r-- 1 root root 43072 abr 5 2017 /usr/lib/x86_64-linux-gnu/libOpenCL.so.1.0.0
はい!もう赤いテキストはありません。これでファイルlibOpenCL.so.1.0.0
が存在します。
答え2
問題はlibOpenCL.so.1
シンボリックリンクではなくシンボリックリンクであるということです。壊れたシンボリックリンク。
$ ls -la /usr/lib/x86_64-linux-gnu/ | grep libOpenCL
lrwxrwxrwx 1 root root 18 Dec 18 2015 libOpenCL.so.1 -> libOpenCL.so.1.0.0
上記の出力は、「実際の」ファイルへのシンボリックリンクのみを示していますlibOpenCL.so.1.0.0
。ただし、そのファイルは同じディレクトリに存在する必要がありますが、使用できません。これがENOENT
ファイルを読み取ろうとすると、strace出力が報告される理由です。
答え3
私は問題を解決したので、他の人が同じピットに陥る場合に備えて、私がしたことを投稿しています。
まず、私はしたここに壊れたシンボルリンクがあります。
$ ls -la /usr/lib/x86_64-linux-gnu/ | grep libOpenCL
lrwxrwxrwx 1 root root 18 Dec 18 2015 libOpenCL.so.1 -> libOpenCL.so.1.0.0
私はOpenCLをインストールしました:OpenCLアプリケーション用のIntel SDK、私のインストールは少し混乱していた。
わずかな調査の後にIntel SDKをインストールすると、OpenCL共有ライブラリがインストールされることがわかりました(年とバージョンの変更を考慮)。/opt/intel/system_studio_2019/opencl_compilers_and_libraries_18.1.0.013/linux/compiler/lib/intel64_lin/
。私のシステム(Linux Mint)の場合、これはデフォルトの場所です(インストール中に変更できる唯一の場所/opt/intel/
)。実際には次のようになります。
$ ls -l /opt/intel/system_studio_2019/opencl_compilers_and_libraries_18.1.0.013/linux/compiler/lib/intel64_lin/ | grep libOpenCL
lrwxrwxrwx 1 root root 16 Aug 16 04:35 libOpenCL.so -> ./libOpenCL.so.1
lrwxrwxrwx 1 root root 18 Aug 16 04:35 libOpenCL.so.1 -> ./libOpenCL.so.2.0
-rwxr-xr-x 1 root root 48216 Sep 21 2018 libOpenCL.so.2.0
つまり、唯一の「実際の」ファイルは一連のlibOpenCL.so.2.0
シンボリックリンクですlibOpenCL.so -> libOpenCL.so.1 -> libOpenCL.so.2.0
。
また、私が見つけたものにはかなり良く見えるシンボリックリンクがたくさんあります。/etc/alternatives/
(基本的に私が理解したところ、このシンボリックリンクはライブラリ名の末尾にある数字を解析し、実際のライブラリが変更されたときに仲介者として機能します。私が指摘したように、以前はすべてのシステムで同じでした):
$ ls -l /etc/alternatives/ | grep OpenCL
lrwxrwxrwx 1 root root 115 Aug 16 04:35 opencl-libOpenCL.so -> /opt/intel/system_studio_2019/opencl_compilers_and_libraries_18.1.0.013/linux/compiler/lib/intel64_lin/libOpenCL.so
lrwxrwxrwx 1 root root 117 Aug 16 04:35 opencl-libOpenCL.so.1 -> /opt/intel/system_studio_2019/opencl_compilers_and_libraries_18.1.0.013/linux/compiler/lib/intel64_lin/libOpenCL.so.1
lrwxrwxrwx 1 root root 119 Aug 16 04:35 opencl-libOpenCL.so.2.0 -> /opt/intel/system_studio_2019/opencl_compilers_and_libraries_18.1.0.013/linux/compiler/lib/intel64_lin/libOpenCL.so.2.0
だから私ができる最も簡単なことは、上記の壊れたシンボリックリンクを完全に削除し(ただrm
)、ライブラリ名の末尾にある各番号に1つずつ3つの新しいシンボリックリンクを作成することでした。
$ cd /usr/lib/x86_64-linux-gnu
$ sudo ln -s /etc/alternatives/opencl-libOpenCL.so libOpenCL.so
$ sudo ln -s /etc/alternatives/opencl-libOpenCL.so.1 libOpenCL.so.1
$ sudo ln -s /etc/alternatives/opencl-libOpenCL.so.2.0 libOpenCL.so.2.0
今、/usr/lib/x86_64-linux-gnu
ディレクトリは次のようになり、すべてがうまくいくようです。
$ ls -l /usr/lib/x86_64-linux-gnu/ | grep OpenCL
lrwxrwxrwx 1 root root 37 Aug 16 04:47 libOpenCL.so -> /etc/alternatives/opencl-libOpenCL.so
lrwxrwxrwx 1 root root 39 Aug 16 04:47 libOpenCL.so.1 -> /etc/alternatives/opencl-libOpenCL.so.1
lrwxrwxrwx 1 root root 41 Aug 16 04:35 libOpenCL.so.2.0 -> /etc/alternatives/opencl-libOpenCL.so.2.0
答え4
libOpenCL.so.1 を指すシンボリックリンク libOpenCL.so を作成します。それはすべてです。
$ cd /usr/lib/x86_64-linux-gnu/
$ ln -fs libOpenCL.so.1 libOpenCL.so