Я создаю библиотеку комплексных чисел/функций 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'
Пожалуйста, обратите внимание, что:
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);
....
_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_)
Это означает, что ваш компилятор не может найти определение функции, вам нужно реализовать его в файле заголовка.
c++filt
. Что мне не очень понятно, так это то, почему после создания статической библиотеки я могу использовать оператор+
вmain
функции, но у меня нет видимости такой перегрузки внутри функции, определенной вFunction_Overloads.cu
. Не могли бы вы предложить какой-либо тест, который я могу сделать, чтобы решить эту проблему (при условии, что у этой проблемы есть решение :-))?