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:
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?
Re-Run 2017. Yay.
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.
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:
<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 - -
- ou dans le sous-arbre des Références VS2015 -
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:
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).This is not used
Dans votre paramètre global, cela sera interprété comme vrai.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.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.
Vous devez donner au paramètre la valeur appropriée pour apporter de la clarté:
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
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>
Il semble que vous devez également définir
<IgnoreImportLibrary>false</IgnoreImportLibrary>
dans le projet REFERENCED.