OpenCV + CUDA + OSX Mavericks

OpenCV + CUDA + OSX Mavericks

本文关键字:Mavericks OSX CUDA OpenCV      更新时间:2023-10-16

在将我的OSX更新到10.9(Maverick(之后,我无法编译支持CUDA的OpenCV。我能够安装CUDA SDK并编译和运行所有样本,所以这不是CUDA的问题。

我收到以下错误:

[ 22%] Built target IlmImf
[ 22%] Building NVCC (Device) object modules/core/CMakeFiles/cuda_compile.dir/src/cuda/./cuda_compile_generated_matrix_operations.cu.o
clang: error: unsupported option '-dumpspecs'
clang: error: no input files
CMake Error at cuda_compile_generated_matrix_operations.cu.o.cmake:206 (message):
Error generating
/Users/josericardo/Downloads/opencv-2.4.6.1/build/modules/core/CMakeFiles/cuda_compile.dir/src/cuda/./cuda_compile_generated_matrix_operations.cu.o

有人有这个问题吗?我在网上搜索过这个特定的错误(以前的错误确实有一些建议,但这次没有(,但没有成功。

非常感谢!

这是一个"老"问题,因为Mac上的默认编译器是llvm而不是gcc,OSX 10.8上也会出现这种情况。

先决条件:如果您使用的是新的Mac,或者是直到最近(比如说,3或4个月前(才安装开发工具的Mac,那么您需要通过检查/usr/bin的内容来检查机器上是否安装了gcc/g++

如果未安装gcc/g++,则需要通过自制程序等方式进行安装。

Cmake设置:cmake设置中,确保C和C++CUDA主机编译器都设置为您安装的gcc/g++,通常在/usr/local/bin中。在这个问题中也可以找到一些有用的信息。

以下是我如何使用Xcode 5.0.2和CUDA 5.5:在OSX Mavericks 10.9.1上编译OpenCV 2.4.8

  • 打开CMake以设置项目和基本配置
  • 在最新的Xcode中(我认为>=5(,不再有gcc编译器,取而代之的是clang,所以转到CMAKE项目的CUDA选项,将CUDA_HOST_COMPLER更改为使用"/usr/bin/clang"。幸运的是,CUDA 5.5支持clang,而不仅仅是gcc
  • 显然,CUDA 5.5只支持旧的libstdc++库,而不支持更现代的libc++,因此更新CUDA_NVCC_FLAGS以告知mvcc通过告知natia compilar使用此旧库。添加"-Xcompiler-stdlib=libstdc++;-Xlinker-stdlib=libstdc++">
  • 还告诉编译库的其余部分的C++编译器使用libstdc++:显示CMAKE的高级选项,并转到CMAKE将"-stdlib=libstdcC++"添加到CMAKE_CXX_FLAGS和CMAKE_EXE_LINKER_FLAGS

好吧,经过几天的艰苦工作,我终于让它在我的机器上工作了。

我使用了Opencv 2.4的git版本,但我想它与您使用的版本没有太大区别。

我遇到的问题如下:

  • 在Mac 10.9上,gcc已从clang的利润分配中删除。然而,CUDA拒绝被叮当使用。即使在cmake中将CUDA_HOST_COMPLER设置为gcc版本也是不够的,因为链接将由主编译器完成,并且不适用于clang。此外,CUDA不接受>=4.7的gcc版本。长话短说,我安装了一个带有macports的gcc旧版本来编译所有的库
  • 如果你使用gcc而不是clang,问题是对QTKit最新框架(QuickTimeKit(的调用不再编译,所以我不得不停用它(你可以在OpenCVFindLibsVideo.cmake->set(HAVE_QTKit NO(中更改它(
  • 我还必须安装Qt5才能有一个工作的GUI(否则highgui模块将无法编译,其中包括"imload"answers"imwrite"函数(
  • 也不要使用cmake 2.8.12,而是2.8.11,因为它有一些链接器选项的错误->http://comments.gmane.org/gmane.comp.programming.tools.cmake.user/48007
  • 您还必须设置CMAKE_SYSTEM_PROCESSOR。如果未设置,则在FindCUDA.cmake行762和770中生成错误

可能我忘了几件事,我想我也不得不停用ffmpeg。这最终相当困难,但现在一切似乎都正常了:-(

@Marco发布的解决方案对我来说是有效的。不过,还有一点需要注意。由于我们已经使用libstdc++编译了OpenCV,我们将不得不更改自己的应用程序,以便也与此stdlib链接。如果我们试图在没有libstdc++标志的情况下编译,我们会得到未定义的符号链接错误,类似于以下内容:

Undefined symbols for architecture x86_64:
    "cv::imwrite(cv::String const&, cv::_InputArray const&, std::__1::vector<int, std::__1::allocator<int> > const&)", referenced from:
    lbp::LBP::saveLBPImage(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in LBP.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)