Cuda-C - Linker-Fehlermeldung - undefined reference
Ich habe eine harte Zeit, die das kompilieren eines einfachen cuda-Programm ist zusammengesetzt aus nur zwei Dateien.
Den main.c sieht wie folgt aus:
#include "my_cuda.h"
int main(int argc, char** argv){
dummy_gpu();
}
Den cuda.h sieht wie folgt aus:
#ifndef MY_DUMMY
#define MY_DUMMY
void dummy_gpu();
#endif
Und die my_cuda.cu-Datei loos wie dieser:
#include <cuda_runtime.h>
#include "my_cuda.h"
__global__ void dummy_gpu_kernel(){
//do something
}
void dummy_gpu(){
dummy_gpu_kernel<<<128,128>>>();
}
Aber wenn ich compile ich immer die folgende Fehlermeldung:
gcc -I/usr/local/cuda/5.0.35/include/ -c main.c
nvcc -c my_cuda.cu
gcc -L/usr/local_rwth/sw/cuda/5.0.35/lib64 -lcuda -lcudart -o md.exe main.o my_cuda.o
main.o: In function `main':
main.c:(.text+0x15): undefined reference to `dummy_gpu'
collect2: ld returned 1 exit status
Danke für Eure Hilfe.
- Mein CUDA ist rostig, aber Sie sollten nicht in der Lage, um Symbole zusammengestellt, die mit dem nvcc-compiler. Müssen Sie setup ein kernel, und nennen Sie die notwendigen Funktionen starten, wenn ich mich nicht Irre.
- Die eigentliche Frage ist: warum nicht nvcc für die Verknüpfung und lassen Sie es die Arbeit machen? Oder so etwas wie CMake?
- CMake würde scheitern.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie ein problem mit der symbol-name mangling.
nvcc
verwendet die host-C++ - compiler zu kompilieren host-code, und dies bedeutet, dass das symbol die name manglings angewendet wird, um code emittiert, die von der CUDA-toolchain.Gibt es zwei Lösungen für dieses problem. Die erste ist, zu definieren
dummy_gpu
mit C linkage, also diemy_cuda.cu
etwas wie dies:Beachten Sie, dass Sie brauchen, um Ihre Verknüpfung Befehl zu diesem:
weil die CUDA shared libraries angegeben werden müssen nach die Objekt-Dateien, die Sie verwenden.
Ihre zweite alternative wäre die Nutzung entweder
g++
odernvcc
zu tun, die Verknüpfung, in dem Fall das ganze problem sollte verschwinden.my_cuda.h
im mit einbezogen .cu-Datei. Siehe edit von mir aus für weitere details.readelf -s
aber ich weiß nicht, was c++ name mangling und rtti Raum aussah. TIL.Haben Sie eine C/C++ linkage problem. nvcc ist die Dekoration, die Dinge in einem C++ - Mode, sondern Ihre gcc-compiler ist der Umgang mit Dingen mit Hilfe von C-Stil-Gestänge. Eine einfache Möglichkeit, es zu beheben ist, benennen Sie Ihre wichtigsten.c main.cpp und dann wiederholen Sie Ihre Befehle mit g++ statt gcc