【问题标题】:Linking error while compiling opencv with cuda on high sierra在高山脉上用 cuda 编译 opencv 时出现链接错误
【发布时间】:2019-01-27 04:33:42
【问题描述】:

在 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?

【问题讨论】:

  • 你的cmake命令是什么?
  • cmake -DWITH_CUDA=ON -DWITH_OPENGL=OFF -DCUDA_ARCH_BIN=6.1 -DCUDA_VERBOSE_BUILD=ON -DCMAKE_BUILD_TYPE=RELEASE -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules ..

标签: macos opencv macos-high-sierra


【解决方案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... 元素也会在 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,所以我猜它不会很快得到修复。

【讨论】:

    【解决方案2】:

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

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

    -DOPENCV_CUDA_FORCE_BUILTIN_CMAKE_MODULE=ON
    

    这个解决方案对我有用。

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

    【讨论】:

      【解决方案3】:

      抱歉,虽然此解决方法曾经在 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 引起的。

      【讨论】:

      • 我相信问题出在 CMake 3.16 上。我不得不使用 CUDA 10.2 / Xcode 10.2.1 / macOS 10.13.6 重建 OpenCV,并且我的构建完成,但我必须恢复到 CMake 3.14.5(3.14.7 或 3.15.x 也可以工作,但 3.17. x 肯定没有——我直接去了 3.14.5,因为那是最后一次为我工作的版本。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-15
      • 1970-01-01
      • 2017-09-30
      相关资源
      最近更新 更多