다음과 같은 간단한 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 애플리케이션용 인텔 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
) 라이브러리 이름 끝에 있는 각 숫자에 하나씩 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