61 votes

Que fait réellement l'option d'édition de liens "Link Library Dependency" dans Visual Studio 2010 - 2015 et au-delà ?

Jusqu'à VS2008, vous définissiez votre C++ natif les dépendances du projet dans le fichier de la solution ( Project Dependencies ... ) et si (par défaut) l'option du linker

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

est défini, le Visual Studio Build établira automatiquement un lien dans le fichier .lib de tous les projets (DLLs, LIBs) dont ce projet dépend seront liés "statiquement".


Côté Note : Microsoft a modifié le fonctionnement des dépendances dans VS2010 et vous êtes maintenant censé 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

Je suis d'accord avec ça. C'est pas sur quoi porte cette question.

(Une explication ici : Références flexibles de projet à projet .)


Il est toujours Il est toutefois possible de définir les dépendances du projet au niveau de la solution et de l'ensemble du projet. General L'option Linker est également toujours là. Cependant, cela ne fonctionne pas. Voir :

et surtout voir ici (acutal question suit)

Microsoft y confirme que l'option Linker ne fait pas ce que le reste de la population mondiale attend d'elle, et ajoute l'explication suivante :

Merci d'avoir signalé ce retour d'information. Le problème que vous rencontrez est par conception. L'option "Link Library Dependency" est un drapeau qui ne fait que dicter si oui ou non la bibliothèque doit être passée en entrée de l'éditeur de liens. Il ne Il ne trouve pas la dépendance automatiquement. En tant que client, vous devrez définir la dépendance manuellement comme vous le suggérez.

Can quelqu'un peut expliquer ce que cela signifie ou plus précisément : Que fait réellement l'option d'édition de liens "Link Library Dependency" dans Visual Studio 2010 ?

Qu'est-ce qu'une "entrée pour l'éditeur de liens" qui n'est pas réellement liée est censée être ?

38voto

Hans Passant Points 475940

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

enter image description here

0 votes

Pourriez-vous télécharger à nouveau l'image ? Elle a disparu (ou est-ce parce que je suis derrière un pare-feu ?) HAH, c'est un problème de pare-feu. Dans ce cas, pouvez-vous décrire la solution ?

5 votes

( !) J'ai appris depuis que cette réponse est incorrecte. Voir ma nouvelle réponse acceptée ci-dessous pour les détails.

19voto

Martin Ba Points 10243

2017 Re-Run. Yay.

TL;DR

Cette option définit la valeur par défaut (a) pour l'actuel Link Library Dependecies sur chaque référence de projet. Si chaque référence de projet a LinkLibraryDependecies défini, alors il est en fait dépourvu de sens.

Cependant, lorsqu'on ajoute une nouvelle référence, par défaut (dans VS2010 et 2015) la nouvelle <ProjectReference> dans l'élément vcxproj Le fichier fait pas ont ce paramètre défini, cette option est donc pertinente dans la mesure où elle fournit la valeur par défaut pour toutes les références nouvellement ajoutées, tant que leur valeur n'est pas modifiée.

(a) : Il vraiment doit être le même pour toutes les configurations (Debug/Release) et plates-formes (Win32/x64), sinon les choses deviennent vraiment compliquées.

Détails sanglants

Hans a souligné qu'il apparaît pour ne rien faire dans VS2010 comme tel . Cependant, cela ne signifie pas qu'il n'est pas utilisé par VS/MSBuild.

Le nœud du problème est la manière dont cette option est insérée dans le système de gestion de l'information. vcxprj et comment les valeurs par défaut fonctionnent pour le fichier <ProjectReference> dans le fichier msbuild.

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

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 qu'il apparaît d'être en quelque sorte regroupés avec les Link Option, c'est juste là pour vous embrouiller.

Ce que cette en fait dans un vcxproj (ou lorsqu'il provient d'un fichier .props ), est de définir la valeur par défaut de l'option Link Library Dependencies Valeur pour chaque dépendance du projet sur le Frameworks and References dans une boîte de dialogue de paramètres VC VS2010 --

Link Lib in the References 2010

-- ou dans le sous-arbre des références VS2015 --

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 de votre vcxproj ressemblera à ceci :

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

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

Si votre réglage global est false (ou No ), la référence du projet ne sera pas liée à quoi que ce soit. Si c'est true il y aura un lien.

Qui plus est :

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

Et ce n'est pas tout :

Il semble que lors de la conversion des anciennes solutions avec vcproj le convertisseur prendra les anciennes dépendances qui ont été spécifiées dans les fichiers sln et la valeur de la vcproj de l'option Linker du projet, et de définir effectivement l'option LinkLibraryDependency pour chaque ProjectReference qu'il insère dans le nouveau vcxproj - C'est l'une des raisons pour lesquelles j'ai pensé pendant si longtemps que cette option n'existait plus - la plupart de nos projets ont un historique de conversion qui remonte à VS2005.

0 votes

Cette page fournit des informations sur l'option Liens avec la bibliothèque : 3 mai 2010. Amit Mohindra. Références flexibles de projet à projet devblogs.microsoft.com/cppblog/

6voto

user1832522 Points 31

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

5voto

aepurniet Points 992

Ce paramètre doit être défini dans l'onglet Properties / Common / Frameworks and References

Vous pouvez également ajouter quelque chose comme la chose ci-dessous dans votre fichier vcxproj, en utilisant bien sûr le projet réel auquel vous faites référence et l'uuid de ce projet.

<ItemGroup>
    <ProjectReference Include="..\Cpp\Cpp.vcxproj">
        <Project>{c58574bf-9dd8-4cf8-b5b6-6551f2f3eece}</Project>
    </ProjectReference>
</ItemGroup>

4voto

Andras Nagy Points 1

Il semble que tu doives aussi mettre

<IgnoreImportLibrary>false</IgnoreImportLibrary>

dans le projet REFERENCED.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X