¿Qué hace realmente la opción del vinculador "Link Library Dependency" en Visual Studio 2010?
visual-studio-2010 visual-c++ (5)
Hasta VS2008, configura las dependencias de proyecto C ++ nativas en el archivo de solución ( Project Dependencies ...
) y si (de forma predeterminada) la opción Enlazador
Properties -> Linker -> General : Link Library Dependencies = Yes
se establece, la compilación de Visual Studio se vinculará automáticamente en los archivos .lib
de todos los proyectos (DLL, LIB) de los que depende este proyecto y se vinculará "estáticamente" en.
Nota al margen : Microsoft modificó el funcionamiento de las dependencias en VS2010 y ahora se supone que debe agregar la dependencia directamente al proyecto.
Common Properties -> Framework and References : (List of depenencies)
(each lib/dll has a separate option:
Project Reference Properties -> Link Library Dependencies : True|False
Estoy bien con eso. De esto no se trata esta pregunta.
(Una explicación aquí: Referencias flexibles de Project-to-Project .)
Sin embargo, todavía es posible definir dependencias de proyecto en el nivel de Solución y la opción de Enlazador General
también sigue allí. Sin embargo, no funciona. Ver:
- Link Library Dependencies no funciona?
- ¿Visual Studio 2010 rompió "Dependencias del proyecto" entre proyectos de C ++?
- Visual Studio 2010 no está autenticando las bibliotecas estáticas de los proyectos que son dependencias como se supone debe
y especialmente vea aquí (sigue la pregunta acutal)
Donde Microsoft confirma que Linker Option no hace lo que el resto de la población mundial espera que haga, y agrega la siguiente explicación:
Gracias por informarnos de esto. El problema que estás experimentando es por diseño. "Dependencia de biblioteca de enlaces" es un indicador que solo dicta si pasar o no la biblioteca como una entrada al vinculador. No encuentra la dependencia automáticamente. Como cliente, tendrá que definir la dependencia manualmente como sugiere.
¿ Alguien puede explicar lo que eso significa , o más al punto: qué hace realmente la opción del vinculador "Link Library Dependency" en Visual Studio 2010?
¿Qué se supone que es una "entrada al vinculador" que en realidad no está vinculada?
2017 Re-Run. Hurra.
TL; DR
Esta Opción establece el valor predeterminado (a) para las Link Library Dependecies
reales en cada referencia de proyecto. Si cada referencia de proyecto tiene LinkLibraryDependecies
establecido, entonces en efecto no tiene sentido.
Sin embargo, al agregar una referencia nueva, de forma predeterminada (en VS2010 y 2015), el nuevo elemento <ProjectReference>
en el archivo vcxproj
no tiene el conjunto de configuración, por lo que esta opción es relevante ya que proporciona el valor predeterminado para todas las referencias recientemente agregadas. siempre y cuando su valor no se modifique.
(a): Realmente debería ser igual para todas las Configuraciones (Depuración / Versión) y Plataformas (Win32 / x64) o las cosas se vuelven realmente complicadas.
Detalles de Gory
Hans señaló que parece no hacer nada en VS2010 como tal . Sin embargo, esto no significa que VS / MSBuild no lo use en realidad.
La clave es cómo se inserta esta opción en el archivo vcxprj
y cómo funcionan los valores predeterminados para la configuración <ProjectReference>
en el archivo msbuild.
La configuración en el diálogo del Enlazador como se muestra arriba se inserta como:
<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>
Y aunque parece estar de alguna manera agrupada con la opción de Link
, eso está ahí para confundirte.
Lo que esto realmente hace en un archivo vcxproj
determinado (o cuando proviene de un archivo .props
), es establecer el valor predeterminado del Valor de Link Library Dependencies
de la Link Library Dependencies
para cada dependencia del proyecto en la sección Frameworks and References
en un cuadro de diálogo de configuración de VC VS2010 -
- o en el subárbol de las referencias VS2015 -
Y esto es relevante, porque cuando agrega una nueva referencia de proyecto, la entrada predeterminada en su archivo vcxproj
se verá así:
...
<ItemGroup>
<ProjectReference Include="../W32DynLib1/W32DynLib1.vcxproj">
<Project>{96be134d-acb5-....-....-....bb6fe4a7}</Project>
</ProjectReference>
</ItemGroup>
Notarás que aquí falta el elemento secundario <LinkLibraryDependecies>true|false</..>
Esto significa que tu configuración "global" se usará para establecer el valor predeterminado.
Si su configuración global es false
(o No
), la referencia del proyecto no se vinculará en nada. Si es true
, se vinculará en.
Lo que es más:
- Si esta configuración,
LinkLibraryDependency
, falta por completo en su configuración, se establecerá en true (del archivoMicrosoft.Cpp[.Common].props
en la carpeta MSBuild). - Si tiene el valor
This is not used
en su configuración global, esto se interpretará como verdadero . - Si tienes el valor ¡
False is the new truth!
, o tal vez deNo way
en esta configuración, también será interpretada como cierta por la construcción. - La GUI VS2015 mostrará una advertencia si no puede interpretar la cadena aquí:
- La GUI VS2010 mostrará False para TODOS los valores, excepto
false
, aunque esto se interpreta como verdadero al construir el proyecto.
Lo que es aún más:
Parece que al convertir soluciones viejas con archivos vcproj
, el convertidor tomará las dependencias antiguas que se especificaron en el sln
y el valor de la opción Linker del proyecto vcproj
, y realmente configurará LinkLibraryDependency
para cada ProjectReference
que inserte en el nuevo vcxproj
- eso es Una razón por la que pensé que esta es una opción muerta durante tanto tiempo: la mayoría de nuestros proyectos tienen un historial de conversión que data de VS2005.
Aquí hay que ir a, propiedades del proyecto -> propiedades comunes -> marco y referencias y luego agregar una nueva referencia a sus proyectos. Entonces solo funcionará en VS 2010 no como en las primeras versiones de VS
Esto debe establecerse en Properties / Common / Frameworks and References
Alternativamente, puede agregar algo como lo que se muestra a continuación en su archivo vcxproj, por supuesto, utilice el proyecto real al que hace referencia y el sentido de ese proyecto.
<ItemGroup>
<ProjectReference Include="../Cpp/Cpp.vcxproj">
<Project>{c58574bf-9dd8-4cf8-b5b6-6551f2f3eece}</Project>
</ProjectReference>
</ItemGroup>
Parece que también tienes que establecer
<IgnoreImportLibrary>false</IgnoreImportLibrary>
en el proyecto REFERENCED.
Tienes que darle a la configuración el valor adecuado para brindar claridad: