2010-07-07 6 views
0

Je suis en train de compiler un projet en compilant des fichiers d'objets et de les relier ensemble, rien d'extraordinaire:FPUNV refuse de lier mes fichiers objet

hello.o : hello.h hello.cu 
    nvcc hello.cu -c -o hello.o 
#... 
main.o : $(objs) 
    nvcc *.o -o exec 

Quand j'arrive à la phase de liaison, à peu près toutes les méthodes est montré être manquant et non déclaré, malgré le fait que nm montre que chacun est en fait assis dans mes fichiers objets, et leurs noms sont démêlés. Qu'est-ce qui se passe ici?

Répondre

0

Ok, donc la formulation de ma question était incorrecte. En fait, le problème est que je compilait code C comme ceci:

hello.o : hello.h hello.cu 
    nvcc hello.c -c -o hello.o 
#... 
main.o : $(objs) 
    nvcc *.o -o exec 

qui a fait nvcc passer les fichiers .c gcc. Quand j'ai grevé 'nm * .o' pour le nom de ma méthode, j'ai trouvé que les fichiers objet émis par gcc avaient des noms non mélangés, tandis que les fichiers .cu, qui étaient compilés par g ++, attendaient des noms mutilés. Ma solution était de renommer tous les fichiers .c de mon projet en .cu, bien que je pense (mais je n'ai pas testé) que les laisser comme .c et en appelant g ++ explicitement dans le makefile devrait suffire.

+0

FWIW, est arrivé à ce q & a parce que j'essaie de comprendre comment appeler les noms mutilés de C via le lieur 'g ++' (qui semble ignorer les noms mutilés). – ragerdl

0

Votre cible make finale semble fausse: il ne devrait pas dire:

exec : $(objs) 
    nvcc $(objs) -o [email protected] 

Vous devrez peut-être ajouter les bibliothèques CUDA à la ligne de commande (je pense que les chiffres nvcc ce quand vous compilez un .cu fichier directement, mais peut-être pas si vous lui donnez juste .o fichiers). Donc, quelque chose comme ceci:

exec : $(objs) 
    nvcc $(objs) -o [email protected] -lcuda -lcudart -lcublas 

(précisément les bibliothèques que vous avez besoin dépend de votre code)

+0

J'ai inclus cette ligne comme exemple. Ce que vous avez posté est à peu près ce que j'ai en réalité. Je fais également un lien avec les bibliothèques CUDA. Mon problème est avec la phase de liaison elle-même. – Alex

+0

De quels symboles se plaint l'éditeur de liens? cu * ones, ou celles qui devraient provenir de votre code? Est-ce que cela fonctionne pour invoquer l'éditeur de liens séparément? Au moment où vous avez des fichiers objets, vous ne devriez pas avoir besoin de passer par le pilote du compilateur nvcc. – Edric

Questions connexes