2

さて、私はいつもgccコンパイラを使用してきました。これは、この IDE を使用した最初のプロジェクトです。私のプロジェクトは次のように構成されています。

main.cppで宣言されたメソッドa.h a.cを含めて実装するa.ha.h

コンパイルすると、次のようになります。

1>main.obj : error LNK2019: unresolved external symbol "void __cdecl destroyPlayer(struct player *)" (?destroyPlayer@@YAXPAUplayer@@@Z) referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol "void __cdecl drawPlayer(struct player *)" (?drawPlayer@@YAXPAUplayer@@@Z) referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol "void __cdecl movePlayer(struct player *,int *)" (?movePlayer@@YAXPAUplayer@@PAH@Z) referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol "struct player * __cdecl createPlayer(int,int)" (?createPlayer@@YAPAUplayer@@HH@Z) referenced in function _main

これらは のすべての関数ですa.h。GCC コマンド ラインを使用すると、それらをまとめてコンパイルできます。すべてのファイルがプロジェクトに追加されます。何か不足していますか?

4

2 に答える 2

7

エラー メッセージは一目瞭然です。

未解決の外部シンボル "void __cdecl destroyPlayer...

main.cpp と ac があります

main.cpp の場合、リンカは、ah で宣言されたすべての関数が C++ の名前マングリングと C++ 呼び出し規約を使用することを期待しますが、ac リンカは、ah で宣言されたすべての関数が C の命名規則と __cdecl 呼び出し規約を使用することを予期します。

ac のコードが C++ 機能を使用しておらず、C++ 機能を使用する main.cpp から呼び出したい場合は、ah に次を追加する必要があります。

#ifdef __cplusplus
extern "C" {
#endif

// your function declarations

#ifdef __cplusplus
}
#endif

または、C と C++ を混在させる必要がない場合は、すべてのファイルの名前を .c または .cpp に変更します。

最後に、Visual Studio は "仮想" の名前変更をサポートしているため、ファイルの名前が実際に変更されていることを確認してください (プロジェクト内のみで、実際のファイルの名前を変更する必要はありません)。

于 2012-10-27T12:56:51.737 に答える
6

Visual Studio は自動的に.cファイルを C ファイルとしてコンパイルすると思うので、名前マングリングがこれに関与している可能性があります。に名前を変更a.cしてみa.cppて、それが役立つかどうかを確認してください。

于 2012-10-27T10:02:07.847 に答える