Que fait réellement L'option" Linker de dépendance de bibliothèque de lien " dans Visual Studio 2010?

Jusqu'à VS2008, vous avez paramétré vos C++ natif dépendances de projet dans le fichier solution ( Project Dependencies ... ) et si (par défaut) L'Option Linker

Properties -> Linker -> General : Link Library Dependencies = Yes

est défini, la construction de Visual Studio se liera automatiquement dans les fichiers .lib de tous les projets (DLLs, LIBs) sur lesquels ce projet dépend sera" statiquement " lié.


côté Note: Microsoft a changé la façon dont les dépendances fonctionnaient dans VS2010 et vous êtes maintenant censés ajouter la dépendance directement au projet

Common Properties -> Framework and References : (List of depenencies) 

    (each lib/dll has a separate option: 
     Project Reference Properties -> Link Library Dependencies : True|False

ça me va. C'est pas que cette question est à propos.

(Une explication ici: Flexible Projet-pour-les Références de Projet .)


il est still possible cependant de définir les dépendances du projet au niveau de la Solution et l'option General Linker est également still il. Toutefois, il ne fonctionne pas. Voir:

  • lien dépendances de bibliothèque ne fonctionne pas?
  • N'Visual Studio 2010 break "Projet" Dépendances entre les projets C++?
  • Visual Studio 2010 pas autolinking bibliothèques statiques de projets qui sont des dépendances comme il se doit censés
    • "mais assez curieusement, sans enlever l'ancienne interface utilisateur, ou en aucune façon indiquant qu'elle ne fonctionne plus"

et surtout voir ici (acutal question suit)

  • MS Connecter Bug 586113: "Bibliothèque de liens de Dépendances" ne fonctionne pas

où Microsoft confirme que L'Option Linker ne fait pas ce que le reste de la population du monde attend d'elle, et ajoute l'explication suivante:

Merci d'avoir rapporté cette rétroaction. Le problème que vous rencontrez est de par leur conception. "Dépendance de la bibliothèque de liens" est un drapeau qui dicte seulement si oui ou non pour passer la bibliothèque comme entrée au linker. Il n' pas trouver la dépendance automatiquement. En tant que client, vous aurez pour définir le depedency manuellement comme vous le suggérez.

peut n'importe qui peut expliquer ce que cela signifie , ou plus au point: Que fait l'option" Lien de dépendance de bibliothèque " linker fait réellement dans Visual Studio 2010?

Qu'est-ce qu'un "input to the linker" qui n'est pas réellement lié censé être?

49
demandé sur Community 2011-10-07 10:44:06

5 réponses

vous devez donner au paramètre la valeur appropriée pour apporter la clarté:

enter image description here

39
répondu Hans Passant 2011-10-07 09:25:50

Re-Run 2017. Yay.

TL; DR

cette Option définit la valeur par défaut (a) pour le Link Library Dependecies réel sur chaque référence de projet. Si chaque référence de projet a LinkLibraryDependecies ensemble, alors il est en effet sans signification.

cependant, lors de l'ajout d'une nouvelle référence, par défaut (dans VS2010 et 2015) le nouvel élément <ProjectReference> dans le fichier vcxproj ne pas ont le jeu, de sorte que cette option est pertinente en ce qu'elle fournit la valeur par défaut pour tous les nouveaux ajouté des références, aussi longtemps que leur valeur n'est pas modifiée.

(a): vraiment doit être la même pour toutes les Configurations (Debug/Release) et les plates-formes (Win32/x64) ou les choses deviennent vraiment compliqué.

détails sanglants

Hans a souligné qu'il apparaît "1519420920 de" ne pas faire n'importe quoi dans VS2010 en tant que tel . Cependant, cela ne signifie pas qu'il n'est pas utilisé par VS/MSBuild.

l'essentiel est de savoir comment cette option est insérée dans le fichier vcxprj et comment les valeurs par défaut fonctionnent pour le paramètre <ProjectReference> dans le fichier msbuild.

le paramètre de la boîte de dialogue Linker indiqué ci-dessus est inséré comme suit:

Not actually implemented

<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
...
  <ItemDefinitionGroup>
    <ClCompile>
...
    </ClCompile>
    <Link>
...
    </Link>
    <ProjectReference>
      <LinkLibraryDependencies>This option is not used by VS 2010!</LinkLibraryDependencies>
    </ProjectReference>
...
  </ItemDefinitionGroup>
</Project>

et bien que apparaisse comme pour être d'une façon ou d'une autre groupé avec l'Option Link , c'est juste là pour vous confondre.

ce que fait réellement dans un fichier vcxproj (ou en venant d'un fichier .props ), est à définir la valeur par défaut de la Link Library Dependencies valeur pour chaque projet dépendant de la Frameworks and References section dans une boîte de dialogue VS2010 VC settings --

Link Lib in the References 2010

- ou dans le sous-arbre de l'VS2015 Références --

Link Lib in the References 2015

et ceci est pertinent, car lorsque vous ajoutez une nouvelle référence de projet, l'entrée par défaut dans votre fichier vcxproj ressemblera à ceci:

...
  <ItemGroup>
    <ProjectReference Include="..\W32DynLib1\W32DynLib1.vcxproj">
      <Project>{96be134d-acb5-....-....-....bb6fe4a7}</Project>
    </ProjectReference>
  </ItemGroup>

vous remarquerez que le sous-élément <LinkLibraryDependecies>true|false</..> est absent ici: cela signifie que votre paramètre" global " sera effectivement utilisé pour définir la valeur par défaut.

si votre paramètre global est false (ou No ), la référence du projet ne sera liée à rien. Si c'est true , il se connectera.

de plus:

  • Si ce paramètre, LinkLibraryDependency , est complètement absent de votre paramètres, il sera par défaut à true" 1519420920 (à partir du fichier Microsoft.Cpp[.Common].props dans le dossier MSBuild).
  • si vous avez la valeur This is not used dans votre paramètre global, cela sera interprété comme vrai .
  • si vous avez la valeur False is the new truth! , ou peut-être No way dans ce paramètre, il sera aussi être interprété comme vrai par la construction.
  • L'interface graphique VS2015 affichera un avertissement si elle ne peut pas interpréter la chaîne ici.: String value 'False is the new truth!' cannot be translated to any value from type Boolean.
  • le GUI VS2010 affichera False pour toutes les valeurs, sauf false , même si cela est alors interprété comme vrai lors de la construction du projet.

Quoi de plus?:

Il semble que lors de la conversion des vieux Solutions vcproj des fichiers, le convertisseur de prendre les anciennes dépendances qui ont été spécifiés dans le sln et la valeur de la vcproj projet de l'option de l'éditeur de liens, et en fait le LinkLibraryDependency pour chaque ProjectReference il insère dans le nouveau vcxproj - c'est une raison que je pense que c'est une voie sans option si longtemps, la plupart de nos projets de conversion de l'histoire de rencontres retour à VS2005.

7
répondu Martin Ba 2017-11-19 20:10:25

ici, la chose est que vous devez aller à, Propriétés du projet -> propriétés communes -> cadre et références et ensuite ajouter une nouvelle référence à vos projets. Alors seulement il fonctionnera dans VS 2010 pas comme dans les premières versions de VS

6
répondu user1832522 2012-11-17 21:07:48

cela doit être défini dans le Properties / Common / Frameworks and References

alternativement vous pouvez ajouter quelque chose comme la chose ci-dessous dans votre fichier vcxproj, bien sûr utiliser le projet réel que vous référencez et l'uuid de ce projet.

<ItemGroup>
    <ProjectReference Include="..\Cpp\Cpp.vcxproj">
        <Project>{c58574bf-9dd8-4cf8-b5b6-6551f2f3eece}</Project>
    </ProjectReference>
</ItemGroup>
5
répondu aepurniet 2017-08-24 11:41:22

il semble que vous devez aussi mettre

<IgnoreImportLibrary>false</IgnoreImportLibrary>

dans le projet référencé.

3
répondu Andras Nagy 2013-11-22 21:16:43