2010-08-14 10 views
5

Estoy haciendo algo de programación con CUDA C de nVidia. Estoy usando Visual Studio 2008 como entorno de desarrollo y estoy teniendo problemas con algunos enlaces y me pregunto si alguien sabe cómo solucionarlo o ha tenido el mismo problema y podría ofrecer una solución.Problema de Vinculación de Visual Studio con Cuda

Mi programa se compone de 3 archivos. 1 archivo de cabecera (stuff.h), 1 archivo de origen C (stuff.c) y 1 archivo CUDA C (main.cu). (Los nombres son falsos pero es solo para ilustrar el punto).

Ahora stuff.h/stuff.c define/implementa algunas funciones auxiliares que llamo desde adentro main.cu.

Estoy usando Visual Studio 2008 y Cuda.rules de GPU Computing SDK de nVidia y todo compila bien, pero ... cuando se trata de unir todos los archivos, falla. Parece que todas las funciones definidas en stuff.h (e implementadas en stuff.c) no se están vinculando correctamente ya que están marcadas como "símbolos externos no resueltos".

¿Cuáles son las posibles causas y cómo podría solucionarlo?

Muchas gracias,

ExtremeCoder


Bueno por lo que han logrado conseguir todo compilación. Parece que todo lo que tuve que hacer fue cambiar la extensión del archivo de implementación de material de .c a .cpp (lo que significa compilar como C++ funciona mientras que compilar como c no lo hace).

¿Qué podría estar causando esto? Yo prefiero mantener todo como .c en lugar de .cpp (ya que esto sirve realmente para ser un código C ...

Cualquier punteros?

Respuesta

2

El archivo main.cu está siendo procesada por NVCC que, por defecto, es un compilador de C++ (en realidad es una envoltura alrededor de la CUDA subyacente compilador y cl.exe, el compilador MS predeterminado). Como resultado, busca las funciones con enlace C++, mientras que compilándolas como C tiene los enlaces C.

Si desea mantener su código como C entonces usted puede editar stuff.h para declarar las funciones como extern "C":

/* in stuff.h */ 
if defined(__cplusplus) 
    extern "C" 
    { 
#endif 
/* ... your declarations ... */ 
if defined(__cplusplus) 
    } 
#endif 

O puede envolver la inclusión de stuff.h en main .cu:

// in main.cu 
extern "C" 
{ 
#include "stuff.h" 
} 
+0

Gracias por la ayuda. Lo tengo funcionando. ¿Hay alguna manera de hacer que los archivos .cu compilen como archivos C y no como archivos C++? Gracias. – ExtremeCoder

+0

Puede probar la opción '--host-compilation = c', pero vea esta publicación para las advertencias: http://forums.nvidia.com/index.php?showtopic=101609. En general, prefiero mantener mi función 'main' y todo lo demás en archivos C/C++ estándar y luego solo tengo kernels y wrappers en los archivos CU. Muchas de las cosas de Thrust también necesitan ir a los archivos CU ... – Tom

1

Hay un proyecto VS 2005 que utiliza CUDA para convertir las imágenes a su representación en escala de grises here. utiliza OpenCV, sin embargo. Si ya ha instalado debería ser bastante sencillo.

Pero incluso si usted no tiene OpenCV y no quiere compilar la aplicación, VS 2008 puede convertir y abrir este proyecto, y podrá ver cómo debe separar el código fuente CUDA del código C/C++ y cómo configurar las propiedades del proyecto correctamente.

También debo señalar este gran tema:

How do I start a new CUDA project in Visual Studio 2008?

+0

Gracias por la respuesta, me ha ayudado un poco más, pero no a lo que esperaba lograr. He echado un vistazo a algunos otros proyectos, he echado un poco el hilo y parece que si todo lo que hago es cambiar la extensión de stuff.c a stuff.cpp todo funciona bien. ¿Qué podría estar causando esto? Gracias. – ExtremeCoder

+0

¡Bien! ¿Usar la extensión .cpp es un problema para ti? Si necesita ayuda para comprender su problema, necesitamos que edite su pregunta y pegue los mensajes de error que VS 2008 le brinda. – karlphillip

Cuestiones relacionadas