C言語 LNK2023エラーの原因と対策について解説
c言語プロジェクトでLNK2023エラーが発生する場合、リンカーツールがmsobj90.dllの誤ったバージョンを読み込んでいる可能性があります。
link.exeとdllファイルのバージョンを合わせるよう確認し、Kernel32.dllやMsvcr90.dllなどの依存関係もチェックすると改善につながるかもしれません。
エラー概要
LNK2023エラーの基本情報
LNK2023エラーは、リンカーツールが使用するmsobj90.dll
のバージョンに関する問題で発生するリンクエラーです。
エラーメッセージには「不良 dll またはエントリ ポイント < dll またはエントリ ポイント >」といった文言が含まれる場合があり、正しいバージョンのmsobj90.dll
が読み込まれていないことを示しています。
このエラーは、link.exe
とmsobj90.dll
のバージョンが一致していない場合に発生するため、両ファイルの整合性を確認する必要があります。
C言語プロジェクトで発生する背景
C言語のプロジェクトでは、複数のライブラリやコンポーネントが組み合わされてプログラムが構築されます。
その中で、ビルドおよびリンク作業を担うlink.exe
は、必要なDLLファイルを読み込みながら最終的な実行ファイルを生成します。
適切な開発環境が整っていない場合、もしくは古いDLLファイルがシステムに残っている場合、msobj90.dll
のバージョン不整合が発生し、LNK2023エラーが起こる可能性が高くなります。
リンカーツールの動作概要
リンカーツールであるlink.exe
は、コンパイル済みのオブジェクトファイルやライブラリファイルを結合し、最終的な実行ファイルまたはライブラリを生成します。
この過程で、依存するDLLファイル(例えばmsobj90.dll
など)の正しいバージョンが読み込まれているかをチェックします。
バージョンが一致していない場合、互換性の問題が発生し、リンクエラーとして検出されるため、システム上のDLLファイルが意図したバージョンかどうかを確認することが重要です。
エラー原因分析
msobj90.dll関連の問題
不正なdllバージョンの読み込み
このエラーは、msobj90.dll
が正しいバージョンでないファイルを読み込んだ場合に発生します。
システム上に古いDLLファイルが残っている場合や、複数のVisual Studioやコンパイラ環境が混在している場合、誤ったバージョンが利用されることがあります。
正しいバージョンのDLLファイルを使用するように、開発環境のパス設定やインストール済みパッケージを確認する必要があります。
link.exeとのバージョン整合性の不一致
link.exe
とmsobj90.dll
は、同じバージョンのコンポーネントから生成されている必要があります。
もしどちらかのバージョンが異なる場合、整合性が取れずリンクエラーが発生します。
これにより、意図しない挙動が生じることがあるため、両者のバージョンを比較し、一致しているかを確認することが求められます。
依存DLLの問題
Kernel32.dllの依存状況確認
msobj90.dll
はシステムDLLであるKernel32.dll
に依存しているため、Kernel32.dll
自体の整合性やバージョンも確認する必要があります。
通常、Kernel32.dll
はWindowsの更新プログラムにより管理されますが、システムに問題がある場合はリンクエラーが誘発される原因となる可能性があります。
Msvcr90.dllのバージョンチェック
また、msobj90.dll
が依存しているMsvcr90.dll
のバージョンも重要なポイントです。
Msvcr90.dll
はMicrosoft Visual C++のランタイムライブラリであり、プロジェクトによっては特定のバージョンを要求する場合があります。
不適切なバージョンが使用されると、リンク時にエラーが発生するため、正しいバージョンのランタイムライブラリが参照されているかどうかを確認することが必要です。
エラー対策
バージョン整合性の確認手順
msobj90.dllとlink.exeのバージョン照合
まずは、msobj90.dll
とlink.exe
のバージョンをそれぞれ確認し、整合性が取れているかを確認します。
ファイルのプロパティからバージョン情報を参照するか、以下のようなサンプルコードを利用してバージョン情報の取得を試みることができます。
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
// サンプル関数: ファイルのバージョン情報取得(疑似コード)
void printVersion(const char* filePath) {
// この関数は実際のバージョン情報取得処理を実装するためのサンプルです。
// 実際の実装では、Windows API の GetFileVersionInfo や VerQueryValue を使用します。
printf("ファイル %s のバージョン情報を取得します。\n", filePath);
}
int main(void) {
// サンプルとしてそれぞれのファイルパスを指定します
const char* msobjPath = "C:\\Windows\\System32\\msobj90.dll";
const char* linkPath = "C:\\Program Files\\Microsoft Visual Studio\\VC\\bin\\link.exe";
// バージョン情報を出力して照合を行います
printVersion(msobjPath);
printVersion(linkPath);
// 両者のバージョンが一致していない場合は、再インストールやアップデートが必要です
return 0;
}
ファイル C:\Windows\System32\msobj90.dll のバージョン情報を取得します。
ファイル C:\Program Files\Microsoft Visual Studio\VC\bin\link.exe のバージョン情報を取得します。
DLL依存関係の確認方法
DLL依存関係の確認は、専用のツールを用いると便利です。
代表的なツールとしては、Dependency Walkerや、Visual Studioに付属するdumpbin /DEPENDENTS
コマンドがあります。
これらのツールを使用することで、msobj90.dll
が依存しているDLLファイル(例えばKernel32.dll
やMsvcr90.dll
)の一覧と、それぞれの参照状況を確認することができます。
必要なDLLの更新手順
必要なDLLの更新は、公式のMicrosoft Visual C++ Redistributable Packageを再インストールすることが有効です。
また、Windows Updateを実行し、システム全体の更新を確認することも推奨されます。
これにより、各DLLの最新バージョンが適用され、バージョン不整合の問題が解消される可能性が高くなります。
開発環境設定の見直し
環境変数や設定ファイルの再確認
開発環境が正しく構成されているかを確認するため、環境変数や設定ファイルのチェックが必要です。
特に、PATH
変数に不要な古いディレクトリが含まれていないか、または正しいコンパイラやリンカーツールのパスが設定されているかを見直してください。
Visual Studioの場合、.vcxproj
や.props
ファイル内の設定も、使用しているコンポーネントのバージョンに合わせたものに更新されているかを確認することが重要です。
トラブルシューティング事例
エラー発生時の状況検証
発生ログのチェック手法
エラーが発生した際には、ビルドログやリンクログを詳細に確認することが有用です。
ログには、どのDLLが読み込まれているか、どの部分でバージョン不整合が発生しているかなどの情報が記録されているため、エラーの原因特定に役立ちます。
Visual Studioの出力ウィンドウや、コマンドラインでのビルド実行時に表示されるエラーメッセージを丁寧に確認してください。
修正事例の具体例
対策適用後の検証ポイント
対策を適用した後は、再コンパイルおよびリンクを実施し、エラーが解消されたかどうかを検証してください。
具体的には、以下のポイントを確認することが推奨されます。
msobj90.dll
とlink.exe
のバージョンが一致しているか- DLL依存関係ツールを用いた各依存DLLの状態が正常か
- 環境変数や設定ファイルに不整合がないか
これらの確認作業により、エラーが再発しないことを確実に確認することができます。
まとめ
この記事では、C言語のプロジェクトで発生するLNK2023エラーの基本情報、原因となるDLL(msobj90.dll、Kernel32.dll、Msvcr90.dll)のバージョン整合性の問題、リンカーツールの動作について解説しました。
エラー対策として、バージョン照合、依存DLLの確認、環境変数や設定ファイルの見直しの手順を示し、トラブルシューティング事例も通じて具体的な解決方法が理解できます。