2010-08-14 8 views
5

Je suis en train de faire de la programmation avec CUDA C de nVidia. J'utilise Visual Studio 2008 comme environnement de développement et j'ai quelques problèmes de liaison et je me demande si quelqu'un sait comment y remédier ou a eu le même problème et pourrait offrir une solution.Problème de liaison Visual Studio avec Cuda

Mon programme est constitué de 3 fichiers. 1 fichier d'en-tête (stuff.h), 1 fichier source C (stuff.c) et 1 fichier CUDA C (main.cu). (Les noms sont faux mais c'est juste pour illustrer le point).

Maintenant stuff.h/stuff.c définit/implémente certaines fonctions d'aide que j'appelle depuis main.cu. J'utilise Visual Studio 2008 et les Cuda.rules du GPU Computing SDK de nVidia et tout se compile bien mais ... quand il s'agit de lier tous les fichiers ensemble, il échoue. Il semble que toutes les fonctions définies dans stuff.h (et implémentées dans stuff.c) ne sont pas liées correctement car elles sont marquées comme "symboles externes non résolus".

Quelles sont les causes possibles et comment puis-je résoudre ce problème?

Un grand merci,

ExtremeCoder


Bon alors j'ai réussi à obtenir tout compilation. Il semble que tout ce que j'avais à faire était de changer l'extension du fichier d'implémentation stuff de .c en .cpp (ce qui signifie que la compilation en C++ fonctionne alors que la compilation en c ne l'est pas!).

Ce qui pourrait être à l'origine de cela? Je préfère garder tout comme .c au lieu de cpp (comme cela est vraiment destiné à être le code C ...

Tous les pointeurs?

Répondre

2

Le fichier main.cu est en cours de traitement par nvcc qui, par défaut, est un compilateur C++ (en fait il est un wrapper autour de la CUDA sous-jacente compiler et cl.exe, le compilateur MS par défaut). Par conséquent, il cherche les fonctions avec une liaison C++, alors qu'en les compilant en C, vous avez les liaisons C.

Si vous voulez garder votre code comme C alors vous pouvez modifier stuff.h de déclarer les fonctions extern « C »:

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

Ou vous pouvez envelopper l'inclusion de stuff.h dans le principal .cu:

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

Merci pour l'aide. Je l'ai fait fonctionner. Est-il possible de faire des fichiers .cu compiler en tant que fichiers C et non en tant que fichiers C++ alors? Merci. – ExtremeCoder

+0

Vous pouvez essayer l'option '--host-compilation = c', mais voir cet article pour les mises en garde: http://forums.nvidia.com/index.php?showtopic=101609. En général, je préfère conserver ma fonction 'main' et tout le reste dans les fichiers C/C++ standard, puis avoir uniquement des noyaux et des wrappers dans les fichiers CU. Beaucoup de trucs Thrust doivent aussi aller dans des fichiers CU ... – Tom

1

Il y a un projet VS 2005 qui utilise CUDA pour convertir les images à leur

Mais même si vous n'avez pas OpenCV et que vous ne voulez pas compiler l'application, VS 2008 peut convertir et ouvrir cette application. projet, et vous serez en mesure de voir comment vous devez séparer le code source CUDA du code C/C++ et comment configurer correctement les propriétés du projet

Je tiens également à souligner ce grand fil:

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

+0

Merci pour la réponse, il m'a aidé un peu plus loin mais pas à ce que j'espérais atteindre. J'ai effectivement jeté un coup d'oeil à d'autres projets, j'ai fait un tour un peu et il semble que si tout ce que je fais est de changer l'extension de stuff.c en stuff.cpp tout fonctionne bien. Ce qui pourrait être à l'origine de cela? Merci. – ExtremeCoder

+0

Bien! L'utilisation de l'extension .cpp est un problème pour vous? Si vous avez besoin d'aide pour comprendre votre problème, nous avons besoin de vous pour modifier votre question et collez les messages d'erreur VS 2008 vous donne. – karlphillip