トラブル対処法

コンパイラ エラー (Compiler Errors)

C1083

filetype ファイルを開けません。'file' : message致命的なエラー C1083 | MSDN

  • ファイル名を間違えている。
  • コンパイラの検索パスにファイルが含まれていない。
  • ファイル名のバージョンを間違えている。
  • プリコンパイル済みヘッダーがコンパイルされていない。

stdint.h

include ファイルを開けません。'stdint.h': No such file or directory

これはVisual Studio 2010より前には、stdint.hが含まれていないのが原因です。このファイルはVisual C++ 2010 Expressなどをインストールし、%PROGRAMFILES%\Microsoft Visual Studio 10.0\VC\include\stdint.hからコピーすることで入手できます。c++ - Why Microsoft Visual Studio cannot find <stdint.h>? - Stack Overflow

C2065

'identifier': 定義されていない識別子です。コンパイラ エラー C2065 | MSDN

  1. 識別子のつづりを間違えている。
  2. 識別子の大文字と小文字を間違えている。
  3. 文字列定数を閉じる引用符がない。
  4. /Zc:forScopeでコンパイルしているときに、forの反復子変数がループの外側で宣言されていない。
  5. 現在の環境でサポートされていないSDKの関数を呼び出している。
  6. 必要なインクルード ファイルを除外している。
  7. 名前空間が適切に指定されていない。

または/TCオプションでCコードとしてコンパイルしていると、C++の識別子は未定義となります。

現在の設定で何がインクルードされているかは、C++のプロジェクトのプロパティの【構成プロパティ → C/C++ → 詳細設定】にある[インクルード ファイルの表示]を、[はい (/showIncludes)]とすることで確認できます。

C4005

'identifier': マクロが再定義されました。 (macro redefinition)」コンパイラの警告 (レベル 1) C4005 | MSDN

同一のマクロが2回定義されているためで、このときコンパイラは2回目の定義を用います。このようなことが起こる原因としては、

  • コマンドラインとコードでそれぞれ定義されている。
  • includeしているファイル内で定義されている。

といったことが考えられます。これを解決するにはいずれかの定義を削除するか、2回目の定義の前に#undefで先に削除します。

__CLR_VER

'__CLR_VER': マクロが再定義されました。

__CLR_VERは/clrコンパイラ オプションを指定したときに定義されるマクロで、この場合はコンパイルし直すことで解決できます。Predefined Macros | MSDN

C4278

'function': タイプ ライブラリ '***.dll' の識別子は既にマクロです。'rename' 修飾子を使用してください。コンパイラの警告 (レベル 3) C4278 | MSDN

#importによる名前の競合が原因です。これはrename属性で名前を変更することで解決できます。

#import "***.dll" rename("function","functionNew")

C4278が複数発生する場合には、それぞれの名前を変更します。

#import "***.dll" \
rename("function1","function1New") \
rename("function2","function2New")

もしくはauto_rename属性に名前の変更を委ねます。この場合にはアンダースコアが2つ付加された、__functionの形式に自動で変更されます。

#import "***.dll" auto_rename

ただしauto_renameで名前が変更されるとC4298が発生し、「'function': タイプ ライブラリ '***.dll' の識別子は既にマクロです。'__function' に名前を変更します。」と警告されます。

C4996

'**': This function or variable may be unsafe. Consider using **_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.コンパイラの警告 (レベル 3) C4996 | MSDN

古い形式の関数を使用しているのが原因です。指示に従い、新しい形式を使用するように修正します。Compiler Warning (level 3) C4996 | MSDN

修正できない理由があるならば、以下のいずれかの方法で警告を無視することでも対処できます。

  • プロジェクトのプロパティを開き、[C/C++] → [プリプロセッサ]にある[プリプロセッサの定義]に_CRT_SECURE_NO_WARNINGSを追加する。
  • コードに#define _CRT_SECURE_NO_WARNINGSを記述する。これは問題の関数が宣言されているライブラリを読み込む前に記述する必要がある。よってプリコンパイル済みヘッダーを使用しているならば、最初の#includeより前の位置が適切。
  • コードに#pragma warning(disable:4996)と記述し、#pragmaで警告を抑制する。ただしそれが警告でなくエラーならば、この方法は不可。

リソース コンパイラ エラー (Resource Compiler Errors)

RC1015

cannot open include file 'file'.リソース コンパイラの致命的なエラー RC1015 | MSDN

開けないファイルが'afxres.h'ならば、MFCの利用の有無によって次のように対処します。c++ - Cannot open include file 'afxres.h' in VC2010 Express - Stack Overflow

  • MFCを利用する … [Microsoft Foundation Classes for C++]をインストールする
  • MFCを利用しない … #include "afxres.h"#include "winres.h"に書き換える

リンカー エラー (Linker Errors)

ライブラリなどがリンカで設定されているか確認します。また/NODEFAULTLIBで、[すべての既定のライブラリの無視]や[特定の既定のライブラリの無視]で必要なライブラリが無視されていないか確認します。

LNK1168

ファイル file を開いて書き込むことができません。リンカ ツール エラー LNK1168 | MSDN

fileが開かれているならば、閉じます。またはデバッグが異常終了するとfileのプロセスが残ったままとなることがあるため、タスク マネージャーで確認し終了させます。

LNK2001

外部シンボル "symbol" は未解決です。リンカ ツール エラー LNK2001 | MSDN

依存ファイルを確認します。また/NODEFAULTLIBで、必要なライブラリが無視されていないか確認します。

LNK2019

未解決の外部シンボル 'symbol' が関数 'function' で参照されました。リンカ ツール エラー LNK2019 | MSDN

次のような理由が考えられます。

  • シンボルが定義されているライブラリが、リンクされていない
  • シンボルの宣言と定義で、スペルが異なる
  • 関数の宣言と定義で、引数の型が異なる
  • 宣言されているが、定義がない
  • 関数の宣言と定義で、呼び出し規約が異なる
  • Cで定義されたシンボルが、extern "C"修飾子なく宣言された
  • 静的として定義されたシンボルが、ファイルの外部から参照されている
  • クラスの静的メンバが定義されていない
  • プロジェクトの依存関係が、プロジェクト間の参照にない
  • Windowsアプリケーションの設定で、コンソール アプリケーションをビルドしている
  • 異なるソースファイルの関数のインライン化に、異なるコンパイラ オプションを使用している
  • スコープ外で、自動変数を使用している
  • 対象アーキテクチャでサポートされてない組み込み関数と型を使用している
  • wchar_tを使用しているコードと使用していないコードが混在している

シンボルが定義されているライブラリが、リンクされていない

必要なライブラリを依存ファイルに追加します。何が必要かは、エラーの外部シンボルの関数をMSDNで検索し、そこの必要条件 (Requirements) のライブラリの項目で確認できることがあります。たとえば、

error LNK2019: 未解決の外部シンボル __imp__accept@12 が関数 _accept_from で参照されました。
error LNK2019: 未解決の外部シンボル __imp__bind@12 が関数 _ready_as_server で参照されました。

とエラーとなるときには、msvcrt.libを依存ファイルに追加します。 c++ - Unresolved external symbol LNK2019 - Stack Overflow c++ - What is an undefined reference/unresolved external symbol error and how do I fix it? - Stack Overflow

公開されていない

ライブラリをリンクしているのにエラーとなるときには、その関数がdllexportで外部から参照できるようになっているか確認します。

宣言されているが、定義がない

参照しているヘッダーのソースを見つけられないと、関数が未定義となりこのエラーが発生します。この場合にはソースをプロジェクトに追加します。

LNK2028

"exported_function (decorated_name) が関数 "function_containing_function_call" (decorated_name) で参照されました。リンカ ツール エラー LNK2028 | MSDN

呼び出し元と呼び出し先の呼び出し規約を合わせます。

LNK4075

"option1" は "option2" の指定によって無視されます。リンカー ツールの警告 LNK4075 | MSDN

同時に指定できないオプションが指定されたため、option1の指定が無効になっています。

C++/CLIからC++のLibの参照

/EDITANDCONTINUE は /OPT:LBR の指定によって無視されます。

C++/CLIではエディット コンティニュを利用できないため、それが有効化 (/ZI) されているC++のスタティック ライブラリを読み込むとこの警告が発生します。これはその事実を伝える警告に過ぎず、C++/CLI側では対処できません。もしC++側を変更できるならば、エディット コンティニュを無効化 (/Zi) することで警告はなくなります。visual studio 2012 - Warning LNK4075 when a C++/CLI project references a static lib project with /ZI (Edit And Continue) - Stack Overflow

LNK4099

PDB 'filename' が 'object/library' または 'path' に見つかりません。デバッグ情報がないものとして、オブジェクトにリンクします。リンカー ツールの警告 LNK4099 | MSDN

filenamepdbファイルをobject/libraryに配置します。もしこのエラーが参照しているプロジェクトによるものならば、そのプロジェクトもリビルドします。

LNK4204

'filename' に参照するモジュールのデバッグ情報がありません。デバッグ情報を無視してオブジェクトをリンクします。リンカー ツールの警告 LNK4204 | MSDN

pdbファイルが存在しない、もしくはそれに適切な情報が含まれていないのが原因です。

ランタイム エラー (Runtime Errors)

*** は有効な Win32 アプリケーションではありません。

*** is not a valid Win32 application.

64ビット向けにビルドしたアプリケーションを、32ビット環境で実行しようとしています。32ビット向けにビルドし直します。

MSVCR**.dllが見つからなかったため、このアプリケーションを開始できませんでした。アプリケーションをインストールし直すとこの問題は解決される場合があります。

This application has failed to start because MSVCR**.dll was not found. Re-installing the application may fix this problem.

指定のVisual C++ ランタイムをインストールするか、それを静的リンクで組み込みます。

Microsoft Learnから検索