NVCC se niega a vincular mis archivos de objetos
Pregunta
Estoy intentando compilar un proyecto mediante la compilación de archivos de objetos y luego los une, nada especial:
hello.o : hello.h hello.cu
nvcc hello.cu -c -o hello.o
#...
main.o : $(objs)
nvcc *.o -o exec
Cuando llegue a la fase de enlace, casi se muestra todos los métodos que falta y no declarado, a pesar de que muestra nm que cada uno es, de hecho, sentado dentro de mis archivos de objetos, y sus nombres son unmangled. ¿Que esta pasando aqui?
Solución 2
Ok, así que la formulación de mi pregunta era incorrecta. De hecho, el problema era que yo estaba compilar código C de esta manera:
hello.o : hello.h hello.cu
nvcc hello.c -c -o hello.o
#...
main.o : $(objs)
nvcc *.o -o exec
que causó NVCC para pasar los archivos .c a gcc. Cuando grepped 'nm * .o' por el nombre de mi método, me encontré con que los ficheros objeto emitidos por gcc tenían nombres unmangled, mientras que los archivos .cu, que fueron compilados por g ++, espera que los nombres alterados.
Mi solución fue cambiar el nombre de todos los archivos .c en mi proyecto para .cu, aunque creo (pero no lo he probado) que dejarlos como .c y llamando g ++ en forma explícita en el archivo MAKE debería ser suficiente.
Otros consejos
Sus objetivo finales make
miradas falsa: ¿No debería decir:
exec : $(objs)
nvcc $(objs) -o $@
También puede ser necesario añadir las bibliotecas CUDA a la línea de comandos (creo nvcc
cifras esto cuando se está compilando un archivo .cu
directamente, pero tal vez no si sólo le dan .o
archivos). Por lo tanto, algo más parecido a esto:
exec : $(objs)
nvcc $(objs) -o $@ -lcuda -lcudart -lcublas
(Precisamente el que las bibliotecas que necesita depende de su código)
Me trató de llamar g ++, pero todavía tiene los mismos errores. Se encontró que la respuesta aquí:
http://forums.nvidia.com/index. php? showtopic = 190973 y st = 0 & gopid = 1179661 & # entry1179661
En resumen, los prototipos de funciones tienen que ser correcta.