2013-10-09 83 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); } 
.... 

上述文件除了作爲包含文件處理的類型traits文件外,在命令行上使用nvcccl進行編譯以形成.lib文件。

不幸的是,當我編譯其主要功能包括

#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' 

請注意:

  1. 只有複雜類型int2_,float2_double2_位於BB名稱空間,但我在所有定義文件中添加了using namespace BB;;
  2. 當我在Function_Overloads.cu文件中使用+時出現問題;如果我不使用+,則不會出現問題;
  3. 我(令人驚訝地)可以在main函數中使用+而不會收到任何鏈接錯誤。

任何想法來解決這個問題?

謝謝。

編輯

繼billz的建議,我已經在Function_Overloads.cu文件中添加明確的實例解決了這個問題,就像

__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

_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

相關問題