リンカー

C言語 LNK1287エラーについて解説

この記事は、C言語で発生するリンクエラーLNK1287について説明します。

このエラーは、管理対象エントリーポイント関数の戻り値やパラメーターの型が規定に合致していない場合に出ます。

戻り値はvoidint、パラメーターはvoidまたはString[]にする必要があり、型指定が正しくない場合にエラーが発生します。

エラー原因の検証

管理対象エントリーポイント関数の役割

C言語でCLR(共通言語ランタイム)を使用してアプリケーションを作成する場合、管理対象エントリーポイント関数はプログラムの開始点として動作します。

この関数は、CLRがアプリケーション全体を初期化し、実行するための重要な役割を果たします。

エントリーポイント関数が正しく定義されていないと、リンカがエラーを出力し、プログラムが正常に実行されなくなります。

戻り値型の規定(voidまたはint)

管理対象エントリーポイント関数では、戻り値型としてvoidまたはintのみが許容されます。

  • intを用いた場合、プログラム終了時に返す値を通じて、実行結果や終了状態を示すことができます。
  • voidの場合は、戻り値が不要な処理に適しており、返却値を利用しない設計となります。

例えば、正しい実装例は下記の通りです。

#include <stdio.h>
// managedEntryPoint関数はint型の戻り値を持ちます
int managedEntryPoint(void) {
    // 1 + 2 の計算結果を出力
    int result = 1 + 2;
    printf("計算結果: %d\n", result);
    return 0;
}
int main(void) {
    return managedEntryPoint();
}
計算結果: 3

パラメーター型の規定(voidまたはString[])

管理対象エントリーポイント関数では、パラメーターとしてvoidまたはString[]のみが許容されます。

C言語の場合、これは引数を受け取らない、またはchar *argv[]に相当する引数を受け入れる形となります。

  • 引数を使用する場合、型が適切に指定されていないと、CLR側の規定に反してエラーが発生します。
  • 必要が無い場合は、引数無しvoidで関数を定義するのが安全です。

例えば、引数を使用する場合の正しい実装例は以下となります。

#include <stdio.h>
// managedEntryPointWithArgsはchar *argv[]をパラメーターとして受け取ります
int managedEntryPointWithArgs(int argc, char *argv[]) {
    // 引数の数を出力する
    printf("引数の個数: %d\n", argc);
    return 0;
}
int main(int argc, char *argv[]) {
    return managedEntryPointWithArgs(argc, argv);
}
引数の個数: 1

エラー発生時の確認事項

ソースコードの型指定チェック

LNK1287エラーが発生した際は、ソースコード中のエントリーポイント関数の定義をまず確認します。

  • 戻り値型がvoidまたはint以外になっていないか確認してください。
  • 関数のパラメーターがvoidまたはString[](C言語の場合はchar *argv[]に相当)で定義されているか確認してください。

正しい型指定が行われているかどうかを見直すことで、リンカエラーの解消につながる場合があります。

リンカ設定の確認

コンパイルやリンクの際に使用しているオプションもエラーの原因となることがあります。

  • プロジェクトがCLRをサポートする設定になっているか確認してください。
  • リンカのオプションでエントリーポイント関数に対する特殊な指定がないか確認してください。

適切なリンカ設定を行うことで、エラー発生の原因を取り除くことができます。

エラー修正方法

関数宣言の見直し

エラーの原因がエントリーポイント関数の型指定にある場合、関数宣言の見直しが必要です。

以下に戻り値型とパラメーター型の修正手順を示します。

戻り値型の修正手順

エントリーポイント関数の戻り値型が規定以外の型に変更されている場合、voidまたはintに変更します。

例えば、戻り値型がfloatとなっていた場合、エラーが発生します。

以下のサンプルコードは、戻り値型を正しくintに修正した例です。

#include <stdio.h>
// managedEntryPoint関数はint型の戻り値を持つように修正
int managedEntryPoint(void) {
    // シンプルな算術式の計算 1 + 2
    int result = 1 + 2;
    printf("計算結果: %d\n", result);
    return 0;
}
int main(void) {
    return managedEntryPoint();
}
計算結果: 3

パラメーター型の修正手順

エントリーポイント関数のパラメーター型が正しく定義されていない場合、引数リストをvoidまたは適切な形式(例えば、int argc, char *argv[])に修正します。

以下は、引数無しの定義から引数ありの定義に変更した例です。

#include <stdio.h>
// managedEntryPointWithArgs関数は引数としてintとchar *argv[]を受け取る
int managedEntryPointWithArgs(int argc, char *argv[]) {
    // 引数の個数を表示する
    printf("引数の個数: %d\n", argc);
    return 0;
}
int main(int argc, char *argv[]) {
    return managedEntryPointWithArgs(argc, argv);
}
引数の個数: 1

再ビルド時のチェックポイント

型指定を修正した後は、プロジェクト全体を再ビルドしてエラーが解消されたか確認してください。

  • ソースコード修正後、クリーンビルドを行うことで、キャッシュされたビルド情報による影響を排除できます。
  • リンカの設定やプロジェクトのビルドオプションが正しく適用されているか再度確認してください。

まとめ

本記事では、LNK1287エラーの原因として、管理対象エントリーポイント関数の戻り値型やパラメーター型が規定(voidまたはint、voidまたはString[])に沿って定義されていないことが挙げられると説明しました。

また、ソースコードの型指定チェックやリンカ設定の確認、関数宣言の見直しおよび再ビルド時のポイントについて具体的な例を交えて解説しました。

関連記事

Back to top button
目次へ