Что на самом деле делает параметр компоновщика" зависимость от библиотеки ссылок " в Visual Studio 2010?
до VS2008, вы установите родной C++ зависимости проекта в файле решения (Project Dependencies ...
) и если (по умолчанию) параметр компоновщика
Properties -> Linker -> General : Link Library Dependencies = Yes
установлено, сборка Visual Studio будет автоматически связываться в .lib
файлы всех проектов (DLL, LIBs), от которых зависит этот проект, будут "статически" связаны.
боковая Примечание: Microsoft изменила способ работы зависимостей в VS2010 и теперь вы должны добавить зависимость непосредственно к проекту
Common Properties -> Framework and References : (List of depenencies)
(each lib/dll has a separate option:
Project Reference Properties -> Link Library Dependencies : True|False
меня это устраивает. это не о чем этот вопрос.
(одно объяснение здесь: гибкие ссылки проекта к проекту.)
Это еще однако возможно определить зависимости проекта от уровня решения и General
опция компоновщика также еще там. Однако это не работает. См.:
- зависимости библиотеки ссылок не работают?
- нарушила ли Visual Studio 2010 "зависимости проекта" между проектами C++?
- визуальная студия 2010 не autolinking статические библиотеки из проектов, которые являются зависимостями, как это должно быть должно
и особенно смотрите здесь (acutal вопрос ниже)
где Microsoft подтверждает, что параметр компоновщика не делает то, что ожидает от него остальная часть населения мира, и добавляет следующее объяснение:
спасибо сообщение об этой обратной связи. Проблему вы испытываете это намеренно. "Зависимость библиотеки ссылок" - это флаг, который только диктует передавать или не передавать библиотеку в качестве входных данных компоновщику. Это не найти зависимость автоматически. Как клиент, вы должны будете определите depedency вручную, как вы предлагаете.
Can кто-нибудь объяснит, что это значит, или: что на самом деле делает параметр компоновщика "зависимость библиотеки ссылок" в Visual Studio 2010?
Что такое "вход в компоновщик", который на самом деле не связан?
5 ответов
2017 Перезаезд. Ура.
TL; DR
Такой Вариант задает значение по умолчанию(a) для Link Library Dependecies
на каждую ссылку на проект. Если каждая ссылка проекта имеет LinkLibraryDependecies
set, тогда это фактически бессмысленно.
однако, при добавлении новой ссылки, по умолчанию (в VS2010 и 2015) новый <ProjectReference>
в элементе тут не имеют набор настроек, поэтому эта опция актуальна в том, что она предоставляет значение по умолчанию для всех вновь добавленных ссылок, если их значение не изменяется.
(a): это действительно должно быть одинаковым для всех конфигураций (Debug/Release) и платформ (Win32/x64), или все становится очень сложным.
подробности
Ганс указал что это появляется ничего не делать в VS2010 что такое. Однако это не означает, что он на самом деле не используется VS / MSBuild.
суть в том, как эта опция вставляется в vcxprj
файл и как работают значения по умолчанию для <ProjectReference>
настройка в файле msbuild.
настройки в диалоговом окне компоновщика, как показано выше, вставляется так:
<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>
а то появляется быть как-то сгруппированы вместе с Link
вариант, это просто, чтобы запутать вас.
что это на самом деле в данной vcxproj
файл (или при поступлении из ), является установите значение по умолчанию Link Library Dependencies
стоимостью для каждого проекта зависимость от Frameworks and References
раздел в диалоговом окне настроек VS2010 VC --
-- или в поддереве ссылок VS2015 --
и это важно, потому что при добавлении нового проекта ссылка, запись по умолчанию в вашем vcxproj
файл будет выглядеть так:
...
<ItemGroup>
<ProjectReference Include="..\W32DynLib1\W32DynLib1.vcxproj">
<Project>{96be134d-acb5-....-....-....bb6fe4a7}</Project>
</ProjectReference>
</ItemGroup>
Вы заметите, что <LinkLibraryDependecies>true|false</..>
элемент sub отсутствует здесь: это означает, что вы "глобальный" параметр фактически будет использоваться для установки значения по умолчанию.
если ваша глобальная настройка false
(или No
), ссылка на проект не будет ссылаться ни на что. Если это true
, он будет подключаться.
что еще:
- если этот параметр,
LinkLibraryDependency
, полностью отсутствует в настройках,по умолчанию будет правда (отMicrosoft.Cpp[.Common].props
файл в папке MSBuild). - если у вас есть значение
This is not used
в мире это будет интерпретироваться как true. - если у вас есть значение
False is the new truth!
, а можетNo way
в этой настройке это будет также интерпретируется как true сборка. - графический интерфейс VS2015 отобразит предупреждение, если он не может интерпретировать строку:
- графический интерфейс VS2010 будет дисплей False для всех значений, кроме
false
, хотя это тогда интерпретируется как правда при создании проекта.
что еще:
это кажется что при преобразовании старых решений с vcproj
файлы, конвертер будет принимать старые зависимости, которые были указаны в sln
и значение элемента vcproj
опция компоновщика проекта и фактически установить LinkLibraryDependency
для каждого ProjectReference
он вставляется в новый vcxproj
- Это одна из причин, по которой я думал, что это мертвый вариант так долго - большинство наших проектов имеют историю конверсий, начиная с VS2005.
здесь дело в том, что вам нужно перейти к свойствам проекта -> общие свойства -> рамки и ссылки, а затем добавить новую ссылку на свои проекты. Тогда только он будет работать в VS 2010 не так, как в ранних версиях VS
Это должно быть установлено в Properties / Common / Frameworks and References
в качестве альтернативы вы можете добавить что-то вроде вещи ниже в свой файл vcxproj, конечно, используйте фактический проект, на который вы ссылаетесь, и uuid этого проекта.
<ItemGroup>
<ProjectReference Include="..\Cpp\Cpp.vcxproj">
<Project>{c58574bf-9dd8-4cf8-b5b6-6551f2f3eece}</Project>
</ProjectReference>
</ItemGroup>
похоже, вам также нужно установить
<IgnoreImportLibrary>false</IgnoreImportLibrary>
в указанном проекте.