Arch-Linux
Arch Linux:用 cuda 建構 opencv 的問題;libopencv_core.so.3.4.0:未定義對“cblas_dgemm”的引用
我目前正在嘗試在我的 Arch linux 電腦上建構一個具有 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和-lcublas 添加**到CMAKE_CXX_FLAGS。那根本沒有區別。
另一個部落格的建議包含使用 gcc-6 而不是 g++-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 | +-----------------------------------------------------------------------------+
好的,關閉問題:
問題是 opencv 既需要
Lapack
正常blas
,cblas
也需要使用ceres-solver
. 但是,opencv build only linkscublas
顯然缺乏對 cblas 一些所需功能的支持。此問題的一種解決方案是
cblas
通過添加CMAKE_EXE_LINKER_FLAGS=-lcblas
到cmake
PKGBUILD 文件中的呼叫來手動連結。
cublas
通過在強制支持下手動建構所有依賴項,可能完全規避這個問題。但是,這很乏味並且並不總是可能的,因為cublas
它只是一個部分埠。再次感謝Philippos,他幫助我縮小了問題範圍。