在 high sierra 上用 cuda 编译 opencv 时出现链接错误

Linking error while compiling opencv with cuda on 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 路径。

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

什么是-llib?

我也遇到了同样的问题,有趣的是问题似乎不是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... 元素也会在您执行 make install 时引起问题)

然而,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,所以我猜它不会很快得到修复。

抱歉,虽然此变通方法曾在 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 时遇到了 "nullability" 编译错误,这可能是由 Clang 引起的。

非常有用,但我不得不进一步调查,因为他的解决方案确实不再有效。

终于找到了this answer on opencv github by alalek。简而言之,他建议添加以下 cmake 定义:

-DOPENCV_CUDA_FORCE_BUILTIN_CMAKE_MODULE=ON

这个解决方案对我有用。

P.S.: 目前我在获得很棒的 opencv 构建的过程中设法解决了更多问题。不过目前正在搭建中(44%)希望半小时内完成,哈哈!