Подтвердить что ты не робот

Что на самом деле делает Linker Dependency Link Link Dependency в Visual Studio 2010?

До VS2008 вы устанавливаете свои зависимые от проекта родные С++ в файле решения (Project Dependencies ...), и если (по умолчанию) параметр компоновщика

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

Visual Studio Build будет автоматически связываться в файлах .lib всех проектов (DLL, LIB), в которых этот проект зависит, будет "статически" связан.


Сторона Примечание. Корпорация Майкрософт изменила работу зависимостей в 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 Linker также по-прежнему существует. Однако это не сработает. См:

и особенно см. здесь (acutal question следует)

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

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

Может ли объяснить, что это означает, или более того: что делает в Visual Studio 2010 опция компоновщика "Link Library Dependency"?

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

4b9b3361

Ответ 1

2017 Re-Run. Yay.

TL; DR

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

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

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

Сведения о горах

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

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

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

Фактически не реализовано

<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 (или при выходе из файла .props): установить значение по умолчанию Link Library Dependencies Значение для каждой зависимости проекта от раздел Frameworks and References в диалоговом окне настроек VS2010 VC -

Ссылка Lib в ссылках 2010

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

Ссылка Lib в ссылках 2015

И это актуально, потому что когда вы добавляете новую ссылку на проект, запись по умолчанию в вашем файле vcxproj будет выглядеть так:

...
  <ItemGroup>
    <ProjectReference Include="..\W32DynLib1\W32DynLib1.vcxproj">
      <Project>{96be134d-acb5-....-....-....bb6fe4a7}</Project>
    </ProjectReference>
  </ItemGroup>

Вы заметите, что здесь отсутствует элемент sub <LinkLibraryDependecies>true|false</..>: Это означает, что для установки значения по умолчанию будет использоваться "глобальная" настройка.

Если ваша глобальная настройка false (или No), ссылка на проект не будет ни в чем. Если он true, он будет ссылаться.

Что еще:

  • Если этот параметр, LinkLibraryDependency, полностью отсутствует в ваших настройках, , он будет по умолчанию равным true (из файла Microsoft.Cpp[.Common].props в папке MSBuild).
  • Если у вас есть значение This is not used в вашей глобальной настройке, это будет интерпретироваться как true.
  • Если у вас есть значение False is the new truth! или, возможно, No way в этом параметре, оно также будет интерпретировано как построенное.]
  • В VS2015 GUI появится предупреждение, если оно не может интерпретировать строку здесь: String value
  • В графическом интерфейсе VS2010 будет отображаться False для ВСЕХ значений, кроме false, хотя при построении проекта это интерпретируется как true.

Что еще больше:

Похоже, что при преобразовании старых решений с файлами vcproj конвертер будет брать старые зависимости, которые были указаны в sln и значение параметра проекта vcproj, и на самом деле установить LinkLibraryDependency для каждого ProjectReference он вставляет в новый vcxproj - это одна из причин, по которой я думал, что это мертвый вариант так долго - большинство наших проектов имеют историю конверсии, относящуюся к VS2005.

Ответ 2

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

enter image description here

Ответ 3

Здесь вам нужно перейти, свойства проекта → общие свойства → рамки и ссылки, а затем добавить новую ссылку на свои проекты. Тогда только он будет работать в VS 2010 не как в ранних версиях VS

Ответ 4

Это должно быть установлено в Properties / Common / Frameworks and References

В качестве альтернативы вы можете добавить что-то вроде приведенной ниже в файле vcxproj, конечно же, использовать фактический проект, на который вы ссылаетесь, и uuid этого проекта.

<ItemGroup>
    <ProjectReference Include="..\Cpp\Cpp.vcxproj">
        <Project>{c58574bf-9dd8-4cf8-b5b6-6551f2f3eece}</Project>
    </ProjectReference>
</ItemGroup>

Ответ 5

Кажется, вам также нужно установить

<IgnoreImportLibrary>false</IgnoreImportLibrary>

в проекте REFERENCED.