3

Visual Studio 2012 C++ プロジェクトがあります。最近、それをアンインストールし、Visual Studio 2015 をインストールして、プロジェクトをアップグレードしました。プロジェクトをビルドしているときに、以下に示すエラーが発生します。

関数で参照されているエラー LNK2019 未解決の外部シンボル _memcmp

さらに、コード memcmp 関数のどこにも使用していません。

リンカの詳細機能を使用したところ、出力ファイルに以下が表示されました。

_memcmp が見つかりました

MyC++Project.obj で参照

libcpmtd.lib(xstrcoll.obj) で参照

読み込んだ libvcruntimed.lib(__memcmp_.obj)

ここで2つの質問

1. コードで memcmp を使用していないのに、リンカー エラーが発生するのはなぜですか?

2. memcmp が __memcmp_.obj としてロードされる理由

私のプロジェクトにも次の設定があります。

1.C++ --> コード生成 --> ランタイム ライブラリを /MTd に設定

2.リンカー-->無視すべてのデフォルトライブラリは何も設定されていません

すべてのプロジェクト設定を試しましたが、すべて無駄でした。

使用していないこの memcmp 関数のみに問題があります。

私は mamcpy と memset を使用しましたが、それらに問題はありません

4

3 に答える 3

0

nmakeVisual Studio 2015 を使用した従来の Visual C++ 6.0 ファイルで、この同じ問題に遭遇しました。

このブログ記事「Universal CRT の紹介」では、Visual Studio 2015 ランタイムが複数のライブラリに分割されている方法について説明しています。ランタイムは現在、「CRT を 2 つの論理部分に分割しています。プロセスの起動や例外処理などに必要なコンパイラ サポート機能を含む VCRuntime と、CRT の純粋なライブラリ部分をすべて含む「安定した」部分」です。簡単に更新できるようにします。

このオプションを使用してリンクしない限り/nodefaultlib、プロジェクトをリンクすると正しいライブラリ ファイルがすべて検出されます。オプションでリンクする場合/nodefaultlib、リンク時に複数の追加ライブラリをリンクする必要があります。たとえば、以前はmsvcrt.libCRT DLL を使用するためにリンクしただけだったかもしれませんが、今度は と もリンクする必要がvcruntime.libありucrt.libます。ライブラリの「フレーバー」ごとに、どのライブラリをリンクする必要があるかを示す表を次に示します。

Release DLLs   (/MD ): msvcrt.lib   vcruntime.lib      ucrt.lib
Debug DLLs     (/MDd): msvcrtd.lib  vcruntimed.lib     ucrtd.lib
Release Static (/MT ): libcmt.lib   libvcruntime.lib   libucrt.lib
Debug Static   (/MTd): libcmtd.lib  libvcruntimed.lib  libucrtd.lib

ライブラリの詳細については、Microsoft のドキュメントC ランタイム (CRT) および C++ 標準ライブラリ (STL) .lib ファイルも参照してください。

Microsoft C/C++ 変更履歴 2003 - 2015も参照してください。

于 2021-10-08T01:12:33.387 に答える