Ошибка CUDA: функция уже была определена в другом файле .cu.obj - PullRequest
1 голос
/ 11 июля 2011

Я пытаюсь скомпилировать проект cuda, который мне кто-то прислал.Хотя этап компиляции проходит, этап компоновки не выполняется.Ниже приведен пример ошибки:

Error   298 error LNK2005: "int __cdecl compare_ints(void const *,void const *)" (?compare_ints@@YAHPBX0@Z) already defined in 3level_1.cu.obj  decode_p4.cu.obj    

По сути, файл decode_p4.cu.obj жалуется, что функция compare_ints уже определена в 3level_1.cu.obj.Любые идеи о том, как избежать этого поведения?

Ниже приведен список подобных ошибок, если это помогает:

Error   384 error LNK2005: "int __cdecl compare_ints(void const *,void const *)" (?compare_ints@@YAHPBX0@Z) already defined in 3level_1.cu.obj  decode_p4.cu.obj    god
Error   385 error LNK2005: "int __cdecl cpu_intersection(unsigned int *,int,unsigned int *,int)" (?cpu_intersection@@YAHPAIH0H@Z) already defined in 3level_1.cu.obj    decode_p4.cu.obj    god
Error   386 error LNK2005: "int __cdecl intersection_cpu(unsigned int * * const,int * const,int)" (?intersection_cpu@@YAHQAPAIQAHH@Z) already defined in 3level_1.cu.obj    decode_p4.cu.obj    god
Error   387 error LNK2005: "void __cdecl sort_it(unsigned int * * const,int * const,int)" (?sort_it@@YAXQAPAIQAHH@Z) already defined in 3level_1.cu.obj decode_p4.cu.obj    god
Error   388 error LNK2005: "int __cdecl GPU_Intersection(unsigned int * * const,int * const,int,unsigned int *,unsigned int *,unsigned int *,struct uint4 *)" (?GPU_Intersection@@YAHQAPAIQAHHPAI22PAUuint4@@@Z) already defined in 3level_1.cu.obj decode_p4.cu.obj    god
Error   389 error LNK2005: "int __cdecl ceilPow2(int)" (?ceilPow2@@YAHH@Z) already defined in 3level_1.cu.obj   decode_p4.cu.obj    god
Error   390 error LNK2005: "void __cdecl recAllocate1(int,int)" (?recAllocate1@@YAXHH@Z) already defined in 3level_1.cu.obj decode_p4.cu.obj    god
Error   391 error LNK2005: "unsigned int __cdecl getceilPow2(unsigned int)" (?getceilPow2@@YAII@Z) already defined in 3level_1.cu.obj   decode_p4.cu.obj    god
Error   392 error LNK2005: "void __cdecl runTest(int,char * *)" (?runTest@@YAXHPAPAD@Z) already defined in 3level_1.cu.obj  decode_p4.cu.obj    god
Error   393 error LNK2005: "void __cdecl __device_stub__Z13scanBlockMAX1P5uint4S0_Pj(struct uint4 *,struct uint4 *,unsigned int *)" (?__device_stub__Z13scanBlockMAX1P5uint4S0_Pj@@YAXPAUuint4@@0PAI@Z) already defined in 3level_1.cu.obj  decode_p4.cu.obj    god
Error   394 error LNK2005: "void __cdecl scanBlockMAX1(struct uint4 *,struct uint4 *,unsigned int *)" (?scanBlockMAX1@@YAXPAUuint4@@0PAI@Z) already defined in 3level_1.cu.obj  decode_p4.cu.obj    god
Error   395 error LNK2005: "void __cdecl __device_stub__Z16scanBlockMAX1_gpP5uint4S0_Pj(struct uint4 *,struct uint4 *,unsigned int *)" (?__device_stub__Z16scanBlockMAX1_gpP5uint4S0_Pj@@YAXPAUuint4@@0PAI@Z) already defined in 3level_1.cu.obj    decode_p4.cu.obj    god

Ответы [ 3 ]

8 голосов
/ 11 июля 2011

Это всего лишь предположение, но если это Visual Studio, я уже видел этот случай раньше, когда код находится в файле .cu, который #included. В этом случае он также не должен компилироваться как исходный файл. Чтобы избежать этого, щелкните правой кнопкой мыши один из файлов (трудно определить, какой из вашего описания) и выберите свойства, а затем найдите и установите флажок «исключить из сборки».

0 голосов
/ 19 ноября 2014

У меня была та же проблема с несколькими файлами, и она была сбита с толку, потому что проблемы с множественными определениями обычно решаются путем защиты аля.

# ifndef Function_name_Guard
#define Function_name
your code
#endef % Function_name_Guard

Вместо этого мы пропустили файлы .cu и оставили только основной файл.

0 голосов
/ 11 июля 2011

Похоже, ваш decode_p4.cu 3level_1.cu включает в себя эти функции больше, чем те, сосредоточьтесь на файле, определяющем эти функции.

Обязательно поместите объявления в файл .cuh (такой же, как заголовочный файл в c) и включите cuh вместо файлов cu, а затем проверьте include guard .

Удачи, братан!

...