2011-03-17 4 views
0

Nous avons donc récemment mis à jour notre projet pour utiliser Microsoft Visual Studio 2010 et nous rencontrons quelques problèmes avec nos projets CUDA. J'ai installé 2008, et j'utilise le toolkit vc90, et les fichiers semblent compiler (leurs fichiers .obj associés sont créés). C'est dans le projet qui crée un fichier .lib comme sa sortie. Le fichier .lib est ensuite lié dans un autre projet qui génère des erreurs de liens car l'un des fichiers de la bibliothèque (Matrix.obj) ne trouve pas l'un des symboles qui devraient être dans CUDAMatrix.obj.Microsoft Visual Studio ne lie pas mes fichiers CUDA .obj à mon fichier .lib

J'ai exécuté dumpbin/SYMBOLS sur CUDAMatrix.obj, et le symbole est là, n'est pas UNDEF, et est externe. J'ai couru dumpbin sur notre .lib, et le symbole ne semble pas être à l'intérieur. Je me suis tourné la verbosité de la construction de la bibliothèque et la liste des fichiers OBJ après:

c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\Lib.exe 

Il ne semble pas contenir CUDAMatrix.obj. En résumé, comment le projet Visual Studio sait-il ce que les fichiers .obj doivent coller dans le fichier .lib en cours de création? Je n'ai pu trouver la liste réelle nulle part, et le sous-menu du bibliothécaire n'a pas semblé aider.

Ou le moins commodément, existe-t-il un outil externe (similaire à 'ar' sur linux) que je peux utiliser pour fusionner le .obj produit avec la bibliothèque? Je pensais que peut-être le commutateur/MERGE sur lib.exe le ferait, mais j'ai continué à obtenir une erreur .dll introuvable lorsque j'ai essayé de lancer cela à partir de la ligne de commande.

P.S. Les dumpbins ont également confirmé que les fichiers .lib et .objs étaient tous deux ciblés sur x86.

P.P.S. Les ajouter en tant que «dépendances supplémentaires» chez le bibliothécaire semble fonctionner, mais n'y a-t-il pas un bon moyen de faire cela automatiquement? Ils font après tout partie du projet.

Répondre

2

Cela semble plus difficile, peut-être quelques personnes compétentes/expérimentés répondront aussi ...

Ma première pensée, cependant, est que peut-être votre étape de génération CUDA ne pas « informer » les étapes de construction suivantes correctement quels fichiers il produit et ce qu'ils devraient faire à ce sujet? Parce que VS2010 et VS2008 utilisent un système de construction différent, les problèmes peuvent provenir de cela.

Je dois dire que je ne comprends pas vraiment le nouveau système de construction. J'ai créé mes fichiers grâce à l'essai et l'erreur + un peu d'aide avec le convertisseur de build-rule build200 VS2008-> VS2010 (qui est toujours bogué et ne supporte pas tout).

Dans mon fichier de règles de CUDA de construction (je CUDA.targets)

<Target 
    Name="_SDF_CUDA" 
    ... 
    Outputs="@(SDF_CUDA-&gt;Metadata('Outputs')-&gt;Distinct())" 
    ... 
    > ... 
     <ItemGroup> 
     <SDF_CUDA 
     Condition="'%(SDF_CUDA.NvccCompilation)' == '0'"> 
     <NvccCompilationLine>--compile -o &quot;$(IntDir)%(OutputFile).cu.obj&quot;</NvccCompilationLine> 
     </SDF_CUDA> 
     <SDF_CUDA 
     Condition="'%(SDF_CUDA.NvccCompilation)' == '1'"> 
     <NvccCompilationLine>-cuda -o &quot;$(IntDir)%(OutputFile).cu.c&quot;</NvccCompilationLine> 
     </SDF_CUDA> 
     <SDF_CUDA 
     Condition="'%(SDF_CUDA.NvccCompilation)' == '2'"> 
     <NvccCompilationLine>-gpu -o &quot;$(IntDir)%(OutputFile).gpu&quot;</NvccCompilationLine> 
     </SDF_CUDA> 
     <SDF_CUDA 
     Condition="'%(SDF_CUDA.NvccCompilation)' == '3'"> 
     <NvccCompilationLine>-cubin -o &quot;$(IntDir)%(OutputFile).cubin&quot;</NvccCompilationLine> 
     </SDF_CUDA> 
     <SDF_CUDA 
     Condition="'%(SDF_CUDA.NvccCompilation)' == '4'"> 
     <NvccCompilationLine>-ptx -o &quot;$(IntDir)%(OutputFile).ptx&quot;</NvccCompilationLine> 
     </SDF_CUDA> 
    </ItemGroup> 


... 
    <SDF_CUDA 
    Condition="'@(SDF_CUDA)' != '' and '%(SDF_CUDA.ExcludedFromBuild)' != 'true'" 
    ... 
    OutputFile="%(SDF_CUDA.OutputFile)" 
    ... /> 
</Target> 
... 
    <PropertyGroup> 
    <ComputeLinkInputsTargets> 
      $(ComputeLinkInputsTargets); 
      ComputeSDF_CUDAOutput; 
      </ComputeLinkInputsTargets> 
    <ComputeLibInputsTargets> 
      $(ComputeLibInputsTargets); 
      ComputeSDF_CUDAOutput; 
      </ComputeLibInputsTargets> 
    </PropertyGroup> 
    <Target 
    Name="ComputeSDF_CUDAOutput" 
    Condition="'@(SDF_CUDA)' != ''"> 
    <ItemGroup> 
     <SDF_CUDA Condition="'%(SDF_CUDA.NvccCompilation)' == '0'"> 
     <Outputs>$(IntDir)%(OutputFile).cu.obj</Outputs> 
     </SDF_CUDA> 
     <SDF_CUDA Condition="'%(SDF_CUDA.NvccCompilation)' == '1'"> 
     <Outputs>$(IntDir)%(OutputFile).cu.c</Outputs> 
     </SDF_CUDA> 
     <SDF_CUDA Condition="'%(SDF_CUDA.NvccCompilation)' == '2'"> 
     <Outputs>$(IntDir)%(OutputFile).gpu</Outputs> 
     </SDF_CUDA> 
     <SDF_CUDA Condition="'%(SDF_CUDA.NvccCompilation)' == '3'"> 
     <Outputs>$(IntDir)%(OutputFile).cubin</Outputs> 
     </SDF_CUDA> 
     <SDF_CUDA Condition="'%(SDF_CUDA.NvccCompilation)' == '4'"> 
     <Outputs>$(IntDir)%(OutputFile).ptx</Outputs> 
     </SDF_CUDA> 
    </ItemGroup> 
    <Message Text="Outputs file: %(SDF_CUDA.Outputs)" /> 
    <ItemGroup> 
     <SDF_CUDADirsToMake 
     Condition="'@(SDF_CUDA)' != '' and '%(SDF_CUDA.ExcludedFromBuild)' != 'true'" 
     Include="%(SDF_CUDA.Outputs)" /> 
     <Link 
     Include="%(SDF_CUDADirsToMake.Identity)" 
     Condition="'%(Extension)'=='.obj' or '%(Extension)'=='.res' or '%(Extension)'=='.rsc' or '%(Extension)'=='.lib'" /> 
     <Lib 
     Include="%(SDF_CUDADirsToMake.Identity)" 
     Condition="'%(Extension)'=='.obj' or '%(Extension)'=='.res' or '%(Extension)'=='.rsc' or '%(Extension)'=='.lib'" /> 
     <ImpLib 
     Include="%(SDF_CUDADirsToMake.Identity)" 
     Condition="'%(Extension)'=='.obj' or '%(Extension)'=='.res' or '%(Extension)'=='.rsc' or '%(Extension)'=='.lib'" /> 
    </ItemGroup> 
    <MakeDir 
     Directories="@(SDF_CUDADirsToMake-&gt;'%(RootDir)%(Directory)')" /> 
    </Target> 

Je crois que l'un des derniers noeuds guide fait l'étape suivante de liaison afin d'inclure le fichier généré obj. Lequel exactement? Je ne sais pas :)

Espérons que cela aidera ... en quelque sorte ... bonne chance!

Questions connexes