none
VS 2010 から VS 2019 に移行で LNK2011 エラー。 RRS feed

  • 質問

  • お世話になります。リンクエラーの質問です。

    言語 C++ MFC

    VS 2010 C++ にて、MFC Application の Main と MFC DLL の Sub を作成。

    Main に DLL Sub の Header (Sub.h) を include し、リンカーに Sub.obj を追加。

    上記の状態で VS 2017 を追加インストール。(C# を使用するため)

    この状態まではリンクエラー無し。

    VS 2019 を追加インストール。(VS 2017 のアップで無く別に)

    その後、VS 2010 でビルドすると LNK2011 エラー発生。

    VS 2019 で同プログラムをビルドすると LNK2011 エラーと E0147 (theApp 互換性) エラーが発生。

    別 PC の VS 2010 でビルドすると問題無し。

    VS 2019 をインストールした事により、もとからあった VS 2010 の環境まで変わってしまったように見える。

    自力での解決は困難なため、どなたかご教授の程よろしくお願い致します。


    2021年1月7日 4:32

すべての返信

  • 「LNK2011」は「プリコンパイル済みオブジェクトはリンクされていません。」
    だそうです。

    (1) プリコンパイル済みヘッダーを作成するときにコンパイルしたソース
      ( /Ycのオプションが付いているもので、デフォルトだと stdafx.cpp という名前)
      が、リンクされていないということの様です。
      ですが、まぁそんなことはないでしょう。

    (2) ビルドオプションが変わったせいかもしれません。
       VS2010のツールセットでコンパイルリンクしてみてはどうでしょう。
      やり方は「ソリューションエクスプローラ」内で「(プロジェクト名)」を右クリックして表示される
      コンテキストメニューから「プロパティ」を選択し、
      表示されたDLGの左蘭の「構成プロパティ」の「全般」を選択し、
      右蘭の「プラットフォームツールセット」で「Visual Studio 2010(v???)」を選択します。
      「OK」で消した後、「ソリューションのリビルド」を行います。

    (3) /Ylオプション (デバッグ ライブラリの PCH 参照の挿入)を使用するとLNK2011エラーが発生する場合があるそうです。
      【参考】https://docs.microsoft.com/ja-jp/cpp/porting/visual-cpp-change-history-2003-2015?view=msvc-140

    おそらく最終的には原因を特定しなければならないでしょう。
    それが修正できれば最新のツールセットでコンパイルリンクできるかもしれません。

    2021年1月7日 6:37
  • たなかなかさん、こんにちは。フォーラムオペレーターのKumoです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    Visual Studio 2010 C++ Project Upgrade Guide(英語となりますが)というブログをご覧ください。

    プリコンパイル済みヘッダーを使用する場合、LINKでは、プリコンパイル済みヘッダーで作成されたすべてのオブジェクトファイルがリンクされる必要があります。
    ほかのソースファイルとともに、プリコンパイル済みヘッダーの生成に使うソースファイルがある場合、プリコンパイル済みヘッダーと一緒に作成されたオブジェクトファイルをincludeしなければなりません。

    プリコンパイルしたオブジェクトファイルは正常に生成されるかどうかは確認してみてください。
    生成される場合は、VisualStudioがプリコンパイルしたファイルを位置づけるパスは正しくないかもしれません。
    そのため、パスの設定は正しくないかを確認してください。

    さらに、VS2019のコンパイルオプションを確認して、使用しているオプションはなんでしょうか。
    「/Yc」「/Z7 or /Zi」ですか。

    すでにすべての再コンパイルを試しても機能しない場合は、VS2019で新しい空のプロジェクトを作成し、すべてのソースを追加してビルドする必要があるかと思います。


    どうぞよろしくお願いいたします。 


    MSDN/ TechNet Community Support Kumo ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2021年1月11日 7:36
    モデレータ
  • 早速のご回答ありがとうございました。

    >(1) プリコンパイル済みヘッダーを作成するときにコンパイルしたソース
    >  ( /Ycのオプションが付いているもので、デフォルトだと stdafx.cpp という名前)
    >  が、リンクされていないということの様です。
    >  ですが、まぁそんなことはないでしょう。

    プリコンパイル済みオブジェクトのエラーでしたので対象の obj ファイルが問題と思っていましたが、プリコンパイル済みヘッダーの方が問題になる可能性も考えた方がよいのでしょうか?

    >(2) ビルドオプションが変わったせいかもしれません。
    >   VS2010のツールセットでコンパイルリンクしてみてはどうでしょう。
    >  やり方は「ソリューションエクスプローラ」内で「(プロジェクト名)」を右クリックして表示される
    >  コンテキストメニューから「プロパティ」を選択し、
    >  表示されたDLGの左蘭の「構成プロパティ」の「全般」を選択し、
    >  右蘭の「プラットフォームツールセット」で「Visual Studio 2010(v???)」を選択します。
    >  「OK」で消した後、「ソリューションのリビルド」を行います。

    v141 (Visual Studio 2017) から v100 (Visual Studio 2010) に変更してみましたが、LNK2011 エラーの数が増えたと言う結果になりました。

    コンパイルは全て Release モードで行っております。

    既存のプログラムが複雑なため、1 から検証用のプログラムを作り始めました。作業に時間が掛かると思いますが、またよろしくお願い致します。

    2021年1月13日 1:37
  • 早速のご回答ありがとうございました。

    VS 2010 で使用していたプロジェクトファイルをディレクトリごとコピーして、VC 2019 で初回読み込み時にアップグレードして使用しております。include# 先のディレクトリを変更後、全プロジェクトでビルドしております。(このビルド段階でリンクエラーが出て行かすが)

    >さらに、VS2019のコンパイルオプションを確認して、使用しているオプションはなんでしょうか。

    >「/Yc」「/Z7 or /Zi」ですか。

    /Zi はありましたが /Yc は無く /Yu がありました。

    ご参考までに VS2010 のオプション設定

    /Zi /nologo /W3 /WX- /O2 /Oi /Oy- /D "WIN32" /D "_WINDOWS" /D "NDEBUG" /D "_USRDLL" /D "_WINDLL" /D "_UNICODE" /D "UNICODE" /Gm- /EHsc /MT /GS /Gy /fp:precise /Zc:wchar_t /Zc:forScope /Yu"StdAfx.h" /Fp"Release\TEST.pch" /Fa"Release\" /Fo"Release\" /Fd"Release\vc100.pdb" /Gd /analyze- /errorReport:queue 

    と VS2019 のオプション設定/Yu"stdafx.h" /GS /analyze- /W3 /Gy /Zc:wchar_t /Zi /Gm- /O2 /Fd"Release\vc141.pdb" /Zc:inline /fp:precise /D "WIN32" /D "_WINDOWS" /D "NDEBUG" /D "_USRDLL" /D "_WINDLL" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /Gd /Oy- /Oi /MT /FC /Fa"Release\" /EHsc /nologo /Fo"Release\" /Fp"Release\TEST.pch" /diagnostics:classic 

    です。

    既存のプログラムが複雑なため、1 から検証用のプログラムを作り始めました。作業に時間が掛かると思いますが、またよろしくお願い致します。

    2021年1月13日 2:08
  • すみません。

    >VS 2019 で同プログラムをビルドすると LNK2011 エラーと E0147 (theApp 互換性) エラーが発生。

    E0147 (theApp 互換性) エラーは間違いでした。(別のテスト用プログラムでのエラーでした。)

    よろしくお願い致します。

    2021年1月13日 2:13
  • たなかなかさん、こんにちは。フォーラムオペレーターのKumoです。
    ご返信いただきありがとうございます。

    C++ プロジェクトでSub.objとリンクした場合、コンパイラがソースコードをオブジェクトファイル (* .obj) にコンパイルした後に、リンク手順が実行されます。 リンカー(link.exe)は、オブジェクトファイルを1つの実行可能ファイルに結合します。
    この記事が参考になるかもしれません。


    どうぞよろしくお願いいたします。

    MSDN/ TechNet Community Support Kumo ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2021年1月13日 7:07
    モデレータ
  • すみません。

    バージョンの異なるVSをインストールした状況で何をされたいのかわかりません。

    VS2010で開発されたものをVS2019の開発環境に移行するのが目的でしょうか?

    それならソースをバックアップして、VS2010やVS2017の環境はアンインストールしてから

    VS2019で新規にプロジェクトを起こしてソースを取り込み、オプション設定をいじって

    ビルドすれば悩まずに問題が解決すると思われます。

    または保険のため仮想マシンにVS2010の環境をコピーしておくのも手かと思います。

    2021年3月6日 5:52