C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

■98285 / 1階層)  .cppと.cの混在で外部シンボルが未解決
□投稿者/ とっちゃん (741回)-(2021/10/28(Thu) 11:56:38)
No98284 (身すがら さん) に返信
> .cppと.cを混在させてビルドすると外部シンボルが未解決になります。
> 教えてください。
>
> 【.cppのコード】
> // 前略
> extern int a, b, c;
> extern void test();
>
> 【.cのコード】
> int a, b, c;
>
> void test()
> {
> c = a + b;
> }
>
> 【ビルド結果】
> 1>MFCApplication1Dlg.obj : error LNK2019: 未解決の外部シンボル "void __cdecl test(void)" (?test@@YAXXZ) が関数 "public: void __thiscall CMFCApplication1Dlg::OnBnClickedButtonStart(void)" (?OnBnClickedButtonStart@CMFCApplication1Dlg@@QAEXXZ) で参照されました。
> 1>MFCApplication1Dlg.obj : error LNK2001: 外部シンボル ""int a" (?a@@3HA)" は未解決です。
> 1>MFCApplication1Dlg.obj : error LNK2001: 外部シンボル ""int b" (?b@@3HA)" は未解決です。
> 1>MFCApplication1Dlg.obj : error LNK2001: 外部シンボル ""int c" (?c@@3HA)" は未解決です。

C++ の名前(コンパイラ内部の名前)と、Cの名前の命名規則が違うために発生しています。

.cpp 側を

extern "C" int a, b, c;
extern "C" void test();

または、

extern "C"
{
int a, b, c;
void test();
}

と C 形式の名前で参照するようにすることで、リンクできるようになります。
詳しくは「マングリング」で検索してください。

編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←.cppと.cの混在で外部シンボルが未解決 /身すがら →Re[2]: .cppと.cの混在で外部シンボルが未解決 /身すがら
 
上記関連ツリー

.cppと.cの混在で外部シンボルが未解決 / 身すがら (21/10/28(Thu) 10:47) #98284
.cppと.cの混在で外部シンボルが未解決 / とっちゃん (21/10/28(Thu) 11:56) #98285 ←Now
  └ Re[2]: .cppと.cの混在で外部シンボルが未解決 / 身すがら (21/10/29(Fri) 10:17) #98298 解決済み

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信