Неопределенная ссылка на тип черты

0

Я создаю библиотеку комплексных чисел/функций 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); }
....

Вышеупомянутые файлы, за исключением файла типов признаков, который рассматривается как файл include, скомпилированы в командной строке с использованием 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'

Пожалуйста, обратите внимание, что:

  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);
....
Теги:
linker
operator-overloading

1 ответ

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_)

Это означает, что ваш компилятор не может найти определение функции, вам нужно реализовать его в файле заголовка.

  • 0
    Большое спасибо за то, что указали на это, а также на использование c++filt . Что мне не очень понятно, так это то, почему после создания статической библиотеки я могу использовать оператор + в main функции, но у меня нет видимости такой перегрузки внутри функции, определенной в Function_Overloads.cu . Не могли бы вы предложить какой-либо тест, который я могу сделать, чтобы решить эту проблему (при условии, что у этой проблемы есть решение :-))?
  • 0
    эта ссылка может помочь: stackoverflow.com/questions/495021/…
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню