2013-10-09 2 views
0

CUDA/C++ 복소수/함수 라이브러리를 만들고 있습니다. 특히, 나는 ComplexTypes.cuhComplexTypes.cu 파일에 복합 유형 int2_, float2_double2_ 내 자신의 구현을 정의하고 난 다음 파일 구조가 있습니다형식 특성에 대한 정의되지 않은 참조

Result_Types.cuh - 유형의 특성은 파일 - 정의를 result_type_promotion,

/*************/ 
/* PROMOTION */ 
/*************/ 
template <typename, typename> struct result_type_promotion; 
.... 
template<> struct result_type_promotion< int2_, float2_ > { typedef float2_ strongest; }; 
.... 

/*************/ 
/* FUNCTIONS */ 
/*************/ 

template <typename> struct result_type_root_functions; 
.... 

Operator_Overloads.cuh

template<typename T0, typename T1> __host__ __device__ typename result_type_promotion<T0, T1>::strongest operator+(T0, T1); 
.... 

Operator_Overloads.cu - 복소수 간의 일반적인 작업의 과부하

#include "ComplexTypes.cuh"          
#include "Result_Types.cuh" 
#include "Operator_Overloads.cuh" 
.... 
__host__ __device__ result_type_promotion<int2_,float2_>::strongest   add(const int2_ a, const float2_ b) { result_type_promotion<int2_,float2_>::strongest   c; c.c.x = a.c.x+b.c.x; c.c.y = a.c.y+b.c.y; return c; } 
.... 
__host__ __device__ result_type_promotion<int2_,float2_>::strongest operator+(const int2_ a,const float2_ b) { return add(a,b); } 

Function_Overloads.cuh

template<typename T0> typename result_type_root_functions<T0>::root_functions     Asinh(T0); 

Function_Overloads.cu - 복소수 함수의 과부하

#include "ComplexTypes.cuh"          
#include "Result_Types.cuh" 
#include "Operator_Overloads.cuh" 

__host__ __device__ result_type_root_functions<int>::root_functions   Asinh(const int a)    { return asinh((float)a); } 
.... 

포함 파일로 처리되는 형식 특성 파일을 제외하고 위의 파일은 파일을 형성하기 위해 nvcccl을 사용하여 명령 줄에서 컴파일됩니다.

  1. 만 복잡한 유형을 : 나는

    #include "ComplexTypes.cuh" 
    #include "Result_Types.cuh" 
    #include "Operator_Overloads.cuh" 
    #include "Function_Overloads.cuh" 
    

    을 포함하는 주요 기능을 컴파일 할 때 불행하게도

    , 나는

    Error 247 error : Undefined reference to '_ZplIN2BB5int2_ENS0_7float2_EEN21result_type_promotionIT_T0_E9strongestES4_S5_' in '...Test.lib' 
    

    , 유의하시기 바랍니다 유형의 링크에 오류가 int2_, float2_double2_BB 네임 스페이스이지만 모든 정의 파일에 using namespace BB;을 추가하고 있습니다.

  2. Function_Overloads.cu 파일에 +을 사용할 때 문제가 발생합니다. +을 사용하지 않으면 문제가 발생하지 않습니다.
  3. main 함수에서 나는 놀랍게도 링크 오류를받지 않고 +을 사용할 수 있습니다.

이 문제를 해결하는 방법에 대한 아이디어가 있으십니까?

감사합니다.billz 제안에 따라

편집

, 나는의해 디코딩

__host__ __device__ result_type_promotion<int,int2_>::strongest operator+(const int a,const int2_ b); 
.... 
+1

여기서'operator +'는 정의 되었습니까? – billz

+0

@billz'Operator_Overloads.cu' 파일에서 위를 참조하십시오. – JackOLantern

답변

1

처럼 Function_Overloads.cu 파일에 명시 적 인스턴스화를 추가하여 _ZplIN2BB5int2_ENS0_7float2_EEN21result_type_promotionIT_T0_E9strongestES4_S5_

을 문제를 해결 한이된다 : 함수 정의를 찾을 수없는 컴파일러를 의미

result_type_promotion<BB::int2_, BB::float2_>::strongest operator+<BB::int2_, BB::float2_>(BB::int2_, BB::float2_) 

, 당신은 헤더 파일을 구현해야합니다.

+0

'C++ filt'의 사용법을 지적 해 주셔서 대단히 감사합니다. 왜 저에게 명확하지 않은 이유는 일단 정적 라이브러리를 만든 후에는'main' 함수에서'+'연산자를 사용할 수 있습니까?하지만 Function_Overloads.cu에 정의 된 함수 내에서 그러한 오버로드에 대한 가시성이 없습니다. 이 문제를 해결하기 위해 내가 할 수있는 모든 테스트를 제안 해 주시겠습니까? (이 문제는 해결책이 있습니다 :-))? – JackOLantern

+0

이 링크는 도움이 될 수 있습니다 : http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file – billz

+0

나는 명시 적 인스턴스화 (구현이 아님)를' Function_Overloads.cu' 파일을 수정하여 문제를 해결했습니다. 귀하의 링크 다음에, 나는'Function_Overloads.cu'의 컴파일 유닛에있는 원래 버전에서 연속적으로 링크 될 인스턴스화가 없었으며, 이제 명시 적 인스턴스화가 왜 문제를 해결하는지 이해합니다. 그러나, 왜'main' 함수에서 모든 것이 명시적인 인스턴스화없이 작동하는지 이해할 수 없습니다. – JackOLantern

관련 문제