web-dev-qa-db-fra.com

Que fait en fait l'éditeur de liens "Link Library Dependency" dans Visual Studio 2010 - 2015 et versions ultérieures?

Jusqu'à VS2008, vous définissez vos dépendances du projet C++ natif dans le fichier de solution (Project Dependencies ...) et si (par défaut) l'option Linker

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

est défini, Visual Studio Build sera automatiquement lié dans le .lib les fichiers de tous les projets (DLL, LIB) dont dépend ce projet seront liés "statiquement".


Côté Remarque: 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

Cela me convient. Ce n'est pas l'objet de cette question.

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


Il est encore possible cependant de définir les dépendances du projet au niveau de la Solution et l'option General Linker est également encore là. Mais ça ne marche pas. Voir:

et surtout voir ici (acutal question suit)

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

Merci d'avoir signalé ces commentaires. Le problème que vous rencontrez est de par leur conception. "Link Library Dependency" est un indicateur qui dicte uniquement s'il faut ou non passer la bibliothèque en entrée à l'éditeur de liens. Il ne trouve pas automatiquement la dépendance. En tant que client, vous devrez définir la dépendance manuellement comme vous le suggérez.

Est-ce que n'importe qui peut expliquer ce que cela signifie , ou plus précisément: Qu'est-ce que l'option de l'éditeur de liens "Link Library Dependency" fait réellement dans Visual Studio 2010?

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

51
Martin Ba

Re-Run 2017. Yay.

TL; DR

Cette option définit la valeur par défaut (une) pour le Link Library Dependecies réel sur chaque référence de projet. Si chaque référence de projet a LinkLibraryDependecies définie, elle n'a en fait aucun sens.

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 a le 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 devrait être le même pour toutes les configurations (débogage/version) et plates-formes (Win32/x64) ou les choses deviennent vraiment compliquées.

Détails sanglants

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

Le nœud 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 de l'éditeur de liens, comme illustré 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 alors qu'il apparaît pour être en quelque sorte regroupé avec l'option Link, c'est juste là pour vous confondre.

Ce que cela fait réellement dans un fichier vcxproj donné (ou en venant d'un fichier .props), C'est de définir la valeur par défaut de la valeur Link Library Dependencies pour chaque dépendance de projet sur la section Frameworks and References dans une boîte de dialogue de paramètres VS2010 VC - -

Link Lib in the References 2010

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

Link Lib in the References 2015

Et cela 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 manquant ici: Cela signifie que votre paramètre "global" sera réellement 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 sera lié.

Quoi de plus:

  • Si ce paramètre, LinkLibraryDependency, est complètement absent de vos paramètres, il sera par défaut vrai (à partir du fichier Microsoft.Cpp[.Common].props dans le dossier MSBuild).
  • S'il vous arrive d'avoir 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, elle sera également interprétée comme vraie 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.
  • L'interface graphique VS2010 sera display False pour TOUTES les valeurs, sauf false, même si c'est alors interprété comme vrai lors de la construction du projet.

De plus:

Il semble que lors de la conversion d'anciennes Solutions avec des fichiers vcproj, le convertisseur prendra les anciennes dépendances spécifiées dans le sln et la valeur du vcproj option Linker du projet, et définissez en fait le LinkLibraryDependency pour chaque ProjectReference qu'il insère dans le nouveau vcxproj - c'est une des raisons pour lesquelles je pensais que c'était une option morte pour si longtemps - la plupart de nos projets ont un historique de conversion remontant à VS2005.

7
Martin Ba

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

enter image description here

39
Hans Passant

Ici, la chose est que vous devez aller dans les propriétés du projet -> propriétés communes -> framework et références, 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

6
user1832522

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 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>
5
aepurniet

Il semble que vous devez également définir

<IgnoreImportLibrary>false</IgnoreImportLibrary>

dans le projet REFERENCED.

4
Andras Nagy