2013-05-26 2 views
4

Мне нужно скомпилировать OpenCV 2.4.5 с Visual Studio 2012. В частности, меня интересует компиляция модуля gpu с Cuda 5.0.Build OpenCV в Visual Studio 2012 с CUDA

Для включения компиляции CUDA в VS2012 я следовал this guide.

Я использую CMake для создания VS2012 решения, то для каждого файла .CU я изменить тип элемента из «Custom правила сборки», чтобы «CUDA C/C++»

я могу собрать большинство файлов проект, но на некоторых файлы У меня есть раздражающая проблема.

Например fgd_bgfg.cu причиной

ошибка C2039: 'ParameterType': не является членом 'сорте :: :: ГПУ устройства :: TypeTraits'

Но в type_traits .hpp Я могу прочитать

typedef typename type_traits_detail::Select<IsSimpleParameter<UnqualifiedType>::value, 
      T, typename type_traits_detail::AddParameterType<T>::type>::type ParameterType; 

Это действительно раздражающая проблема, от которой я не могу избавиться!

Не могу поверить, что никто уже не построил opencv с VS2012 и GPU, некоторые советы?

+1

CUDA официально не поддерживает VS2012, поэтому не должно быть слишком сюрпризом, что создание OpenCV с CUDA в VS2012 не работает. – talonmies

+0

Я знаю это, но многие люди уже работают с CUDA с некоторыми трюками, как тот, который я связал в вопросе. Кроме того, в предварительно подготовленной библиотеке OpenCV уже есть исполняемые файлы VS2012. Мне кажется странным, что никто не пытался скомпилировать модуль GPU с VS2012. –

+0

Я смог построить OpenCV в VS 2012 с последним CUDA 5.5 RC (эта версия поддерживает VS 2012 официально). Существует только одна проблема: вы должны установить переменную CMake CUDA_ATTACH_VS_BUILD_RULE_TO_CUDA_FILE в положение OFF. – jet47

ответ

1

Похоже, что компилятор CUDA не может иметь дело с техникой шаблонов. Простым способом является шаблон TypeTraits с тремя примитивными типами: double, float, int. Я не уверен, что это правильно, но компилятор CUDA не будет жаловаться.

Перечни кодов здесь:

template<> struct TypeTraits<double> 
{ 
    typedef type_traits_detail::UnConst<double>::type            NonConstType; 
    typedef type_traits_detail::UnVolatile<double>::type            NonVolatileType; 
    typedef type_traits_detail::UnVolatile<typename type_traits_detail::UnConst<double>::type>::type UnqualifiedType; 
    typedef type_traits_detail::PointerTraits<double>::type       PointeeType; 
    typedef type_traits_detail::ReferenceTraits<double>::type          ReferredType; 

    enum { isConst   = type_traits_detail::UnConst<double>::value }; 
    enum { isVolatile  = type_traits_detail::UnVolatile<double>::value }; 

    enum { isReference  = type_traits_detail::ReferenceTraits<double>::value }; 
    enum { isPointer  = type_traits_detail::PointerTraits<typename type_traits_detail::ReferenceTraits<double>::type>::value }; 

    enum { isUnsignedInt = type_traits_detail::IsUnsignedIntegral<double>::value }; 
    enum { isSignedInt  = type_traits_detail::IsSignedIntergral<double>::value }; 
    enum { isIntegral  = type_traits_detail::IsIntegral<double>::value }; 
    enum { isFloat   = type_traits_detail::IsFloat<double>::value }; 
    enum { isArith   = isIntegral || isFloat }; 
    enum { isVec   = type_traits_detail::IsVec<double>::value }; 

    typedef double ParameterType; 
}; 
template<> struct TypeTraits<float> 
{ 
    typedef type_traits_detail::UnConst<float>::type            NonConstType; 
    typedef type_traits_detail::UnVolatile<float>::type            NonVolatileType; 
    typedef type_traits_detail::UnVolatile<typename type_traits_detail::UnConst<float>::type>::type UnqualifiedType; 
    typedef type_traits_detail::PointerTraits<float>::type       PointeeType; 
    typedef type_traits_detail::ReferenceTraits<float>::type          ReferredType; 

    enum { isConst   = type_traits_detail::UnConst<float>::value }; 
    enum { isVolatile  = type_traits_detail::UnVolatile<float>::value }; 

    enum { isReference  = type_traits_detail::ReferenceTraits<float>::value }; 
    enum { isPointer  = type_traits_detail::PointerTraits<typename type_traits_detail::ReferenceTraits<float>::type>::value }; 

    enum { isUnsignedInt = type_traits_detail::IsUnsignedIntegral<float>::value }; 
    enum { isSignedInt  = type_traits_detail::IsSignedIntergral<float>::value }; 
    enum { isIntegral  = type_traits_detail::IsIntegral<float>::value }; 
    enum { isFloat   = type_traits_detail::IsFloat<float>::value }; 
    enum { isArith   = isIntegral || isFloat }; 
    enum { isVec   = type_traits_detail::IsVec<float>::value }; 

    typedef float ParameterType; 
}; 

template<> struct TypeTraits<int> 
{ 
    typedef type_traits_detail::UnConst<int>::type            NonConstType; 
    typedef type_traits_detail::UnVolatile<int>::type            NonVolatileType; 
    typedef type_traits_detail::UnVolatile<typename type_traits_detail::UnConst<int>::type>::type UnqualifiedType; 
    typedef type_traits_detail::PointerTraits<int>::type       PointeeType; 
    typedef type_traits_detail::ReferenceTraits<int>::type          ReferredType; 

    enum { isConst   = type_traits_detail::UnConst<int>::value }; 
    enum { isVolatile  = type_traits_detail::UnVolatile<int>::value }; 

    enum { isReference  = type_traits_detail::ReferenceTraits<int>::value }; 
    enum { isPointer  = type_traits_detail::PointerTraits<typename type_traits_detail::ReferenceTraits<int>::type>::value }; 

    enum { isUnsignedInt = type_traits_detail::IsUnsignedIntegral<int>::value }; 
    enum { isSignedInt  = type_traits_detail::IsSignedIntergral<int>::value }; 
    enum { isIntegral  = type_traits_detail::IsIntegral<int>::value }; 
    enum { isFloat   = type_traits_detail::IsFloat<int>::value }; 
    enum { isArith   = isIntegral || isFloat }; 
    enum { isVec   = type_traits_detail::IsVec<int>::value }; 

    typedef int ParameterType; 
}; 

скопировать код в type_traits.hpp, за первоначальным определением TypeTraits. Постройте ... потом жертвуйте.

Удачи вам! :-D

+0

Используя главную ветвь, я построил выпуск Emgu x64 с поддержкой VS2012 и CUDA. Для этого мне пришлось внести некоторые изменения: 1.modify Build_Binary_x86.bat, чтобы включить режим CUDA 2. Измените параметр компиляции CUDA «Code Generation»: compute_30, sm_30. Кстати, я работал под Windows 7 64. – igame

Смежные вопросы