我正在創建一個CUDA/C++複雜數字/函數庫。特別是,我已經在ComplexTypes.cuh
和ComplexTypes.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文件外,在命令行上使用nvcc
和cl
進行編譯以形成.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'
請注意:
- 只有複雜類型
int2_
,float2_
和double2_
位於BB
名稱空間,但我在所有定義文件中添加了using namespace BB;
; - 當我在
Function_Overloads.cu
文件中使用+
時出現問題;如果我不使用+
,則不會出現問題; - 我(令人驚訝地)可以在
main
函數中使用+
而不會收到任何鏈接錯誤。
任何想法來解決這個問題?
謝謝。
編輯
繼billz的建議,我已經在Function_Overloads.cu
文件中添加明確的實例解決了這個問題,就像
__host__ __device__ result_type_promotion<int,int2_>::strongest operator+(const int a,const int2_ b);
....
'operator +'定義在哪裏? – billz
@billz在'Operator_Overloads.cu'文件中,參見上文。 – JackOLantern