2012-04-04 5 views
1

Ich habe einige Probleme mit dem Fehler "Link Fehler LNK2005 ... bereits definiert". Die Dateien sind wie folgt:Link Fehler LNK2005 mehrere CUDA Dateien

// File Bitmap4.cu 
#include "Bitmap4.h" // header 
#include "Bitmaps_cuda.h" // header with just the definitions of the kernels 

..... // I call 3+2 kernel functions (3 in one method, 1 in another and 1 in another one) 

Dann habe ich dieses:

// File Bitmap8.cu 
#include "Bitmap8.h" // header 
#include "Bitmaps_cuda.h" // the same as above 

..... // I call 4 kernel functions (4 in the same method) 

Dann habe ich den Kernel-Header:

#ifndef __BITMAPS_KERNEL__ 
#define __BITMAPS_KERNEL__ 

...... // 9 kernels definitions 

#endif 

Und schließlich, ich habe diese ein:

// File Bitmaps_cuda.h 
#include <cuda.h> 
#include <cuda_runtime.h> 
#include <device_launch_parameters.h> 
#include <device_functions.h> 
#include <stdio.h> 

// Inside here there all the kernel functions that the files 
// Bitmap4.cu and Bitmap8.cu are using 

Das Problem ist, dass, wenn ich nicht ' t enthalten die #include "Bitmaps_cuda.h" in einem der Bitmap * .cu, natürlich, der Compiler wird sagen, dass ich die Definitionen der Kernel-Funktionen verpasst. Ich habe viele Posts gelesen und ich habe bereits die "zusätzlichen Abhängigkeiten" und die erforderlichen PATHs eingefügt. Die Probleme begannen, als ich die Datei Bitmap8.cu mit ihren relativen Kernen hinzufügte, weil vorher die Anwendung richtig funktionierte.

Wie auch immer, sind diejenigen, die Fehler, die ich habe:

1>Bitmap8.cu.obj : error LNK2005: "void * __cdecl big_random_block(int([email protected]@[email protected]) already defined in Bitmap4.cu.obj 
1>Bitmap8.cu.obj : error LNK2005: "int * __cdecl big_random_block_int(int([email protected]@[email protected]) already defined in Bitmap4.cu.obj 
1>Bitmap8.cu.obj : error LNK2005: "unsigned char __cdecl value(float,float,int([email protected]@[email protected]) already defined in Bitmap4.cu.obj 
1>Bitmap8.cu.obj : error LNK2005: "void * __cdecl start_thread(unsigned int(__stdcall*)(void *),void *)" ([email protected]@[email protected]@Z) already defined in Bitmap4.cu.obj 
1>Bitmap8.cu.obj : error LNK2005: "void __cdecl end_thread(void *)"([email protected]@[email protected]) already defined in Bitmap4.cu.obj 
1>Bitmap8.cu.obj : error LNK2005: "void __cdecl destroy_thread(void *)"([email protected]@[email protected]) already defined in Bitmap4.cu.obj 
1>Bitmap8.cu.obj : error LNK2005: "void __cdecl wait_for_threads(void * const *,int)"([email protected]@[email protected]) already defined in Bitmap4.cu.obj 
1>Bitmap8.cu.obj : error LNK2005: "void __cdecl__device_stub__Z14float_to_colorPhPKf(unsigned char *,float const *)"([email protected]@[email protected]) already defined in Bitmap4.cu.obj 
1>Bitmap8.cu.obj : error LNK2005: "void __cdecl float_to_color(unsigned char *,float_const *)" ([email protected]@[email protected]) already defined in Bitmap4.cu.obj 
1>Bitmap8.cu.obj : error LNK2005: "void __cdecl__device_stub__Z14float_to_colorP6uchar4PKf(struct uchar4 *,float const *)"([email protected]@[email protected]@[email protected]) already defined in Bitmap4.cu.obj 
1>Bitmap8.cu.obj : error LNK2005: "void __cdecl float_to_color(struct uchar4 *,float_const *)" ([email protected]@[email protected]@[email protected]) already defined in Bitmap4.cu.obj 

1>C:\Users\dberdin\documents\visual studio 2010\Projects\gpuSPAM\Debug\gpuSPAM.exe : fatal error LNK1169: one or more multiply defined symbols found 

ich verschiedene Lösungen versucht, aber mit allen Ergebnissen.

Vielen Dank im Voraus!

EDIT

Auf der Website (http://msdn.microsoft.com/en-us/library/72zdcz6f.aspx) fand ich, dass eine der Ursachen für diesen Fehler ist:
- Absoluter zweimal definiert ist, mit einem anderen Wert in jeder Definition.
Nun, eigentlich, wie ich unten geschrieben habe, habe ich diese Art von Definitionen, aber ich kann nicht anders machen. Irgendeine Idee, wie man es löst?

Vielen Dank noch einmal im Voraus

+0

Ich habe eine Header-Datei zweimal enthalten! Problem gelöst! – davideberdin

Antwort

2

Diese Fehler kamen, weil ich eine Datei doppelt enthalten. Problem gelöst!

1
Then I have the kernel header: 

#ifndef __BITMAPS_KERNEL__ 
#define __BITMAPS_KERNEL__ 

...... // 9 kernels definitions 

#endif 

Sie sagen Meinen, dass Sie 9 Kernel Erklärungen haben, keine Definitionen?

Sie können die Kernel-Definitionen nicht in einer Header-Datei haben.

Stellen Sie sicher, dass alle Ihre .cu-Dateien mit der gleichen Laufzeit verknüpft sind (öffnen Sie das Eigenschaftenblatt für jede .cu-Datei und vergleichen Sie die CUDA C/C++ | Host | Runtime Library-Einstellungen.) Stellen Sie außerdem sicher, dass dieselbe Laufzeit wie von Ihren regulären cpp-Dateien verwendet wird.

+0

Es ist vollkommen legal, Kerneldefinitionen in einem Header zu haben, solange dieser Header nur einmal importiert wird, und über die Gerätecode-Kompilierungstrajektorie. Template-Bibliotheken wie Thrust machen das ausgiebig. – talonmies

+0

"Es ist vollkommen legal, Kerneldefinitionen in einem Header zu haben, solange dieser Header nur einmal importiert wird, und über die Kompilierungstrajektorie des Gerätecodes." Stimmt, aber haben Sie dann wirklich eine Header-Datei?Es ist eher so, dass Sie eine Implementierungsdatei haben, die als Header-Datei getarnt ist, was kein Ende der Verwirrung auf der ganzen Linie verursacht. Template-Kernel Definitionen wären eine Ausnahme, vereinbart. –

+0

Nun, die Lösung von Roger Dahl hat mir geholfen, andere Probleme zu beheben, aber der Compiler gibt mir die gleichen Fehler wie oben beschrieben! Ich kann es nicht bekommen, weil das Problem begann, als ich mehr Kernel-Definitionen und Kernel-Funktionen hinzugefügt habe. Um ehrlich zu sein, ein Teil der Kernel-Funktionen machen die gleichen Operationen außer einigen Parametern im Inneren, aber trotzdem ist es komisch, dass ich nicht kompilieren kann. – davideberdin