Что на самом деле делает параметр компоновщика" зависимость от библиотеки ссылок " в 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 опция компоновщика также еще там. Однако это не работает. См.:

и особенно смотрите здесь (acutal вопрос ниже)

где Microsoft подтверждает, что параметр компоновщика не делает то, что ожидает от него остальная часть населения мира, и добавляет следующее объяснение:

спасибо сообщение об этой обратной связи. Проблему вы испытываете это намеренно. "Зависимость библиотеки ссылок" - это флаг, который только диктует передавать или не передавать библиотеку в качестве входных данных компоновщику. Это не найти зависимость автоматически. Как клиент, вы должны будете определите depedency вручную, как вы предлагаете.

Can кто-нибудь объяснит, что это значит, или: что на самом деле делает параметр компоновщика "зависимость библиотеки ссылок" в Visual Studio 2010?

Что такое "вход в компоновщик", который на самом деле не связан?

5 ответов


вы должны дать настройку правильное значение, чтобы принести ясность:

enter image description here


2017 Перезаезд. Ура.

TL; DR

Такой Вариант задает значение по умолчанию(a) для Link Library Dependecies на каждую ссылку на проект. Если каждая ссылка проекта имеет LinkLibraryDependecies set, тогда это фактически бессмысленно.

однако, при добавлении новой ссылки, по умолчанию (в VS2010 и 2015) новый <ProjectReference> в элементе тут не имеют набор настроек, поэтому эта опция актуальна в том, что она предоставляет значение по умолчанию для всех вновь добавленных ссылок, если их значение не изменяется.

(a): это действительно должно быть одинаковым для всех конфигураций (Debug/Release) и платформ (Win32/x64), или все становится очень сложным.

подробности

Ганс указал что это появляется ничего не делать в VS2010 что такое. Однако это не означает, что он на самом деле не используется VS / MSBuild.

суть в том, как эта опция вставляется в vcxprj файл и как работают значения по умолчанию для <ProjectReference> настройка в файле msbuild.

настройки в диалоговом окне компоновщика, как показано выше, вставляется так:

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>

а то появляется быть как-то сгруппированы вместе с Link вариант, это просто, чтобы запутать вас.

что это на самом деле в данной vcxproj файл (или при поступлении из ), является установите значение по умолчанию Link Library Dependencies стоимостью для каждого проекта зависимость от Frameworks and References раздел в диалоговом окне настроек VS2010 VC --

Link Lib in the References 2010

-- или в поддереве ссылок VS2015 --

Link Lib in the References 2015

и это важно, потому что при добавлении нового проекта ссылка, запись по умолчанию в вашем 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 отобразит предупреждение, если он не может интерпретировать строку: String value 'False is the new truth!' cannot be translated to any value from type Boolean.
  • графический интерфейс 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>

в указанном проекте.