it-roy-ru.com

Что на самом деле делает опция компоновщика «Связать библиотеку ссылок» в Visual Studio 2010 - 2015 и выше?

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

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

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


Сторона Примечание : 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 подтверждает, что Linker Option не делает того, что ожидает от него остальная часть мира, и добавляет следующее объяснение:

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

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

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

50
Martin Ba

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

TL; DR

Эта опция устанавливает значение по умолчанию (А) для фактического 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 References -

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 в этом параметре, оно будет также интерпретироваться как true при сборке.
  • Графический интерфейс VS2015 будет отображать предупреждение, если он не может интерпретировать строку здесь: String value 'False is the new truth!' cannot be translated to any value from type Boolean.
  • Графический интерфейс VS2010 отобразит False для ВСЕХ значений, кроме false, даже если это интерпретируется как true при построении проекта.

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

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

7
Martin Ba

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

enter image description here

39
Hans Passant

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

6
user1832522

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

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

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

Кажется, что вы также должны установить

<IgnoreImportLibrary>false</IgnoreImportLibrary>

в проекте REFERENCED.

4
Andras Nagy