Что на самом деле делает опция компоновщика «Ссылочная библиотека» в Visual Studio 2010 - 2015 и выше? - PullRequest
50 голосов
/ 07 октября 2011

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

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

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


Side Примечание : 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 также все еще .Однако это не работает.См .:

и особенно смотри здесь (острый вопрос следует)

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

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

Может ли кто-нибудь объяснить, что это значит , или даже более точно: Что означает "Параметр компоновщика «Ссылочная библиотека зависимостей» действительно используется в Visual Studio 2010?

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

Ответы [ 5 ]

39 голосов
/ 07 октября 2011

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

enter image description here

7 голосов
/ 20 октября 2017

2017 Перезапуск. Yay.

TL; DR

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

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

(a): действительно должно быть одинаковым для всех конфигураций (отладка / выпуск) и платформ (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 (или при получении из файла .props), так это установка значения по умолчанию 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</..>: это означает, что вы "глобальные" настройки фактически будете использоваться для установки значения по умолчанию.

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

Более того:

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

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

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

6 голосов
/ 18 ноября 2012

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

5 голосов
/ 12 февраля 2013

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

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

<ItemGroup>
    <ProjectReference Include="..\Cpp\Cpp.vcxproj">
        <Project>{c58574bf-9dd8-4cf8-b5b6-6551f2f3eece}</Project>
    </ProjectReference>
</ItemGroup>
4 голосов
/ 23 ноября 2013

Похоже, вам также нужно установить

<IgnoreImportLibrary>false</IgnoreImportLibrary>

в проекте REFERENCED.

...