Arch Linux: cuda로 opencv를 빌드하는 중에 문제가 발생했습니다. libopencv_core.so.3.4.0: 'cblas_dgemm'에 대한 정의되지 않은 참조입니다.

Arch Linux: cuda로 opencv를 빌드하는 중에 문제가 발생했습니다. libopencv_core.so.3.4.0: 'cblas_dgemm'에 대한 정의되지 않은 참조입니다.

저는 현재 내 아치 리눅스 머신에 cuda가 포함된 opencv 버전을 구축하려고 합니다. 이를 위해 나는 사용합니다opencv-cuda-git기본 버전으로. 또한 PKGBUILD를 수정하고 opencv를 내 시스템에 추가로 적용하기 위해 추가 플래그를 추가했습니다.

그러나 빌드 프로세스(makepkg csri)를 실행할 때마다 다음 오류 메시지와 함께 실패합니다.

[ 16%] Building CXX object modules/hdf/CMakeFiles/example_hdf_create_groups.dir/samples/create_groups.cpp.o
cd /home/tobias/builds/opencv-cuda-git/src/opencv/build/modules/hdf && /usr/bin/cmake -E cmake_link_script CMakeFiles/example_hdf_create_groups.dir/link.txt --verbose=1
/bin/g++-6  -std=c++11   -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Wno-narrowing -Wno-delete-non-virtual-dtor -Wno-comment -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffast-math -ffunction-sections -fdata-sections  -msse -msse2 -fvisibility=hidden -fvisibility-inlines-hidden -Wno-invalid-offsetof -O3 -DNDEBUG  -DNDEBUG  -Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now  -Wl,--gc-sections   -rdynamic CMakeFiles/example_hdf_create_groups.dir/samples/create_groups.cpp.o  -o ../../bin/example_hdf_create_groups  -L/opt/cuda/lib64 ../../lib/libopencv_hdf.so.3.4.0 ../../lib/libopencv_highgui.so.3.4.0 ../../lib/libopencv_videoio.so.3.4.0 ../../lib/libopencv_imgcodecs.so.3.4.0 ../../lib/libopencv_imgproc.so.3.4.0 ../../lib/libopencv_core.so.3.4.0 ../../lib/libopencv_cudev.so.3.4.0 
../../lib/libopencv_core.so.3.4.0: undefined reference to `cblas_zgemm'
../../lib/libopencv_core.so.3.4.0: undefined reference to `cblas_sgemm'
../../lib/libopencv_core.so.3.4.0: undefined reference to `cblas_dgemm'
../../lib/libopencv_core.so.3.4.0: undefined reference to `cblas_cgemm'
make[2]: *** [modules/hdf/CMakeFiles/example_hdf_create_groups.dir/build.make:102: bin/example_hdf_create_groups] Error 1
make[2]: Leaving directory '/home/tobias/builds/opencv-cuda-git/src/opencv/build'
make[1]: *** [CMakeFiles/Makefile2:2523: modules/hdf/CMakeFiles/example_hdf_create_groups.dir/all] Error 2
make[1]: Leaving directory '/home/tobias/builds/opencv-cuda-git/src/opencv/build'
make: *** [Makefile:163: all] Error 2

이전 검색에 따르면 이 오류는 cublas의 연결 오류로 인해 발생할 수 있습니다. 그래서 추가해봤는데-L/opt/cuda/lib64그리고-루쿠브라스도착하다CMAKE_CXX_FLAGS. 전혀 차이가 없습니다.

또 다른 블로그에서는 g++-6 대신 gcc-6을 사용하는 것을 제안합니다. 그러나 이렇게 하면 또 다른 오류가 발생합니다.

[ 16%] Linking CXX executable ../../bin/example_hdf_create_groups
cd /home/tobias/builds/opencv-cuda-git/src/opencv/build/modules/hdf && /usr/bin/cmake -E cmake_link_script CMakeFiles/example_hdf_create_groups.dir/link.txt --verbose=1
/bin/gcc-6  -std=c++11   -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Winit-self -Wno-narrowing -Wno-delete-non-virtual-dtor -Wno-comment -fdiagnostics-show-option -Wno-long-long -pthread -fomit-frame-pointer -ffast-math -ffunction-sections -fdata-sections  -msse -msse2 -fvisibility=hidden -fvisibility-inlines-hidden -Wno-invalid-offsetof -O3 -DNDEBUG  -DNDEBUG  -Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now  -Wl,--gc-sections   -rdynamic CMakeFiles/example_hdf_create_groups.dir/samples/create_groups.cpp.o  -o ../../bin/example_hdf_create_groups  -L/opt/cuda/lib64 ../../lib/libopencv_hdf.so.3.4.0 ../../lib/libopencv_highgui.so.3.4.0 ../../lib/libopencv_videoio.so.3.4.0 ../../lib/libopencv_imgcodecs.so.3.4.0 ../../lib/libopencv_imgproc.so.3.4.0 ../../lib/libopencv_core.so.3.4.0 ../../lib/libopencv_cudev.so.3.4.0     
ld: CMakeFiles/example_hdf_create_groups.dir/samples/create_groups.cpp.o: undefined reference to symbol '_ZNSt8ios_base4InitD1Ev@@GLIBCXX_3.4'
/usr/lib/libstdc++.so.6: error adding symbols: DSO missing from command line
make[2]: *** [modules/hdf/CMakeFiles/example_hdf_create_groups.dir/build.make:102: bin/example_hdf_create_groups] Error 1
make[2]: Leaving directory '/home/tobias/builds/opencv-cuda-git/src/opencv/build'
make[1]: *** [CMakeFiles/Makefile2:2523: modules/hdf/CMakeFiles/example_hdf_create_groups.dir/all] Error 2
make[1]: Leaving directory '/home/tobias/builds/opencv-cuda-git/src/opencv/build'
make: *** [Makefile:163: all] Error 2

빌드 프로세스의 전체 출력과 사용자 정의된 PKGBUILD 파일을 찾을 수 있습니다.여기

Cuda 버전 9, nvidia-smi의 출력:

Sun Jan 14 14:44:13 2018       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 387.34                 Driver Version: 387.34                    |        |-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 780 Ti  Off  | 00000000:01:00.0 N/A |                  N/A |
| 32%   27C    P8    N/A /  N/A |    624MiB /  3017MiB |     N/A      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0                    Not Supported                                       |
+-----------------------------------------------------------------------------+

답변1

좋아요, 이 질문을 마치겠습니다.

문제는 .NET을 사용하는 경우 opencv가 제대로 작동 Lapack해야 blas한다는 것입니다 .cblasceres-solvercublas

cblas이 문제에 대한 한 가지 해결책은 PKGBUILD 파일에 호출을 추가하여 수동으로 연결하는 것 입니다 CMAKE_EXE_LINKER_FLAGS=-lcblas.cmake

강제 지원을 사용하여 모든 종속성을 수동으로 구축하면 이 문제를 완전히 피할 수 있습니다 cublas. 그러나 cublas이것은 부분적인 포트일 뿐이므로 지루하고 항상 가능한 것은 아닙니다 .

다시 한번 감사드립니다필립스, 문제의 범위를 좁히는 데 도움을 준 사람입니다.

관련 정보