在高山脉上使用Cuda编译OpenCV时链接错误

时间:2019-01-27 04:33:43

标签: macos opencv macos-high-sierra

在Mac OS X high Sierra(10.13.6)上使用cuda编译opencv时出现链接错误。

错误消息:

[ 21%] Linking CXX shared library ../../lib/libopencv_cudev.dylib
ld: warning: directory not found for option '-L/Users/unknownn/opencv/-Wl,-rpath,/usr/local/cuda'
ld: warning: directory not found for option '-L-Wl,-rpath,/usr/local/cuda'
ld: library not found for -llib
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [lib/libopencv_cudev.4.0.1.dylib] Error 1
make[1]: *** [modules/cudev/CMakeFiles/opencv_cudev.dir/all] Error 2
make: *** [all] Error 2

我已经尝试了几乎所有的cuda(9,9.2,10)和opencv(3.4,4.0.1)版本。我也知道每个cuda版本都需要特定的Xcode版本。

我也尝试过各种cmake版本

我在ccmake中检查了正确的cuda路径。

由于/ usr / local / cuda存在,我不知道为什么会出现ld警告。

什么是-llib?

3 个答案:

答案 0 :(得分:1)

我也遇到了同样的问题,有趣的是,问题似乎与OpenCV无关,而与cmake无关。

cmake随附的FindCUDA似乎已损坏,产生了奇怪的-llib。您可以在cmake运行期间看到它,以及:

Extra dependencies:          cudart_static lib nppc nppial nppicc nppicom nppidei nppif nppig nppim nppist nppisu nppitc npps cublas cufft -L/usr/local/cuda/lib -L-Wl,-rpath,/usr/local/cuda

(请注意第二个元素“ lib”,最后两个-L ...元素也会在进行安装时引起问题)

但是,opencv源程序包随附似乎有效的FindCUDA.cmake文件。

假设: cmake在/ usr / local / share / cmake中 opencv源在〜/ opencv

请先执行以下操作:

mv /usr/local/share/cmake/Modules/FindCUDA* /tmp # Or some other back up location
cp -r ~/opencv/cmake/FindCUDA* /usr/local/share/cmake/Modules

然后像以前一样{cmake ...make ...make install运行您的构建步骤,并希望这次能够正常工作(对我来说确实如此)。

据我所知,cmake已弃用FindCUDA.cmake,因此我猜测它很快将无法修复。

答案 1 :(得分:1)

Answer by Jack Leow非常有用,但是我不得不作进一步调查,因为实际上他的解决方案不再起作用。

最后,我在this answer on opencv github处找到了alalek。简而言之,他建议添加以下cmake定义:

-DOPENCV_CUDA_FORCE_BUILTIN_CMAKE_MODULE=ON

此解决方案对我有用。

P.S .:目前,在设法获得出色的opencv构建的过程中,我设法解决了更多问题。但是目前正在建设中(44%)希望它会在下一个半小时内完成,哈哈!

答案 2 :(得分:0)

对不起,尽管此变通办法仅适用于opencv-3.4.9 / XCode8.2(Clang 8)/ CMake 3.12,但现在结合使用该组合不再适用于FindCUDA文件的切换

opencv-3.4.9 / XCode9.2(Clang 9)/ CMake 3.16,出现以下错误:

CMake Error at /Applications/CMake.app/Contents/share/cmake3.16/Modules/FindCUDA.cmake:416 (file):
file failed to open for writing (Permission denied):
/Users/filippo/opencv- 3.4.9/modules/core/CMakeFiles/cuda_compile.dir/src/cuda/cuda_compile_genera ted_gpu_mat.cu.o.depend
Call Stack (most recent call first):
/Applications/CMake.app/Contents/share/cmake-3.16/Modules/FindCUDA.cmake:1363 (cuda_include_nvcc_dependencies)
/Applications/CMake.app/Contents/share/cmake-3.16/Modules/FindCUDA.cmake:1650 (CUDA_WRAP_SRCS)
/Applications/CMake.app/Contents/share/cmake-3.16/Modules/FindCUDA.cmake:1663 (cuda_compile_base)
cmake/OpenCVDetectCUDA.cmake:262 (CUDA_COMPILE)
cmake/OpenCVUtils.cmake:1513 (ocv_cuda_compile)
cmake/OpenCVModule.cmake:927 (ocv_add_library)
cmake/OpenCVModule.cmake:848 (_ocv_create_module)
modules/core/CMakeLists.txt:81 (ocv_create_module)

我不得不将XCode更新到9.2,因为我在构建opencv-3.4.9时遇到了“可空性”编译错误,可能是Clang引起的。