我正在创建一个 CUDA/C++ 复数/函数库。特别是,我已经定义了我自己的复杂类型的实现int2_
,float2_
并且double2_
在ComplexTypes.cuh
和ComplexTypes.cu
文件中,我有以下文件结构:
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); }
....
上述文件,除了作为包含文件处理的类型特征文件外,在命令行上使用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);
....