web-dev-qa-db-ja.com

Visual Studio 2010-2015以降では、「Link Library Dependency」リンカーオプションは実際に何をしますか?

VS2008まで、ソリューションファイルでnative C++プロジェクトの依存関係を設定しました(Project Dependencies ...)およびif(デフォルト)リンカーオプション

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

設定されている場合、Visual Studioビルドは.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

私はそれで大丈夫です。 これはnotこの質問の意味です。

(ここで1つの説明: 柔軟なプロジェクト間参照 。)


ソリューションレベルでプロジェクトの依存関係を定義することはstill可能であり、Generalリンカーオプションもstillそこ。ただし、機能しません。見る:

特にここを参照してください(実際のquestionが続きます)

Microsoftは、Linker Optionが他の世界の人々が期待することをしていないことを確認し、次の説明を追加します。

このフィードバックをご報告いただきありがとうございます。発生している問題は仕様によるものです。 「リンクライブラリの依存関係」は、ライブラリをリンカーへの入力として渡すかどうかだけを指示するフラグです。依存関係は自動的には検出されません。顧客として、提案どおり手動で依存関係を定義する必要があります。

誰でもその意味を説明できますか、またはそれ以上の点まで:「Link Library Dependency」リンカーオプションが実際に行うことVisual Studio 2010で?

実際にリンクされていないはずの「リンカーへの入力」とは何ですか?

51
Martin Ba

2017再実行。わーい。

TL; DR

このオプションはデフォルト値を設定します(a) 各プロジェクト参照の実際のLink Library Dependecies各プロジェクト参照にLinkLibraryDependeciesが設定されている場合、実際には意味がありません。

ただし、新しい参照を追加する場合、デフォルトで(VS2010および2015で)vcxprojファイルの新しい<ProjectReference>要素はnotに設定されているため、このオプションは値が変更されない限り、新しく追加されたすべての参照のデフォルトを提供するという点で関連します。

(a):It reallyは、すべての構成(デバッグ/リリース)とプラットフォーム(Win32/x64)で同じでなければなりません。

流血の詳細

ハンスが指摘した それが出現 VS2010で何もしないとして。ただし、これは実際にVS/MSBuildで使用されていないという意味ではありません。

重要なのは、このオプションをvcxprjファイルに挿入する方法と、msbuildファイルの<ProjectReference>設定に対するデフォルトの動作です。

上記の「リンカー」ダイアログの設定は次のように挿入されます。

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ファイルで(または.propsfileから来るとき)、のデフォルト値を設定するLink Library Dependencies ValueVS2010のFrameworks and Referencesセクションに対する各プロジェクトの依存関係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].propsfile(MSBuildフォルダー内)。
  • グローバル設定に値This is not usedが含まれている場合、これはtrueと解釈されます
  • この設定で値False is the new truth!、またはNo wayを持っている場合、ビルドによってtrueと解釈されるになります。
  • ここで文字列を解釈できない場合、VS2015 GUIは警告を表示します: String value 'False is the new truth!' cannot be translated to any value from type Boolean.
  • VS2010 GUIは、表示Falseで、falseを除くすべての値に対して、これはその後解釈されますが- trueプロジェクトをビルドするとき。

さらに何が:

それseems古いソリューションをvcprojファイルで変換する場合、コンバーターはslnvcprojプロジェクトの値で指定された古い依存関係を使用します。リンカオプション、および各LinkLibraryDependencyに実際にProjectReferenceを設定します。これは新しいvcxprojに挿入します。 VS2005に遡る変換履歴。

7
Martin Ba

設定を適切な値にして、明確にする必要があります。

enter image description here

39
Hans Passant

ここでは、プロジェクトのプロパティ->共通のプロパティ->フレームワークと参照に移動し、プロジェクトに新しい参照を追加する必要があります。その後、VSの初期バージョンとは異なり、VS 2010でのみ動作します

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