未明确引用类型特征

时间:2013-10-09 08:31:33

标签: c++ linker operator-overloading

我正在创建一个CUDA / C ++复数/函数库。特别是,我在int2_float2_文件中定义了自己的复杂类型double2_ComplexTypes.cuhComplexTypes.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); }
....

上述文件(除了作为包含文件处理的类型特征文件)在命令行上使用nvcccl进行编译,以形成.lib文件。

不幸的是,当我编译包含

的main函数时
#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而不会收到任何链接错误。
  4. 有什么想法解决这个问题吗?

    感谢。

    修改

    根据billz建议,我通过在Function_Overloads.cu文件中添加显式实例来解决问题,例如

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

1 个答案:

答案 0 :(得分:1)

  

_ZplIN2BB5int2_ENS0_7float2_EEN21result_type_promotionIT_T0_E9strongestES4_S5 _

c++filt解码的

变为:

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

这意味着您的编译器无法找到函数定义,您需要在头文件中实现它。