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

わんくま同盟

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

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

ツリー一括表示

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


親記事 / ▼[ 98285 ]
■98284 / 親階層)  .cppと.cの混在で外部シンボルが未解決
□投稿者/ 身すがら (1回)-(2021/10/28(Thu) 10:47:42)

分類:[.NET 全般] 

.cppと.cを混在させてビルドすると外部シンボルが未解決になります。
教えてください。

【.cppのコード】
// 前略
extern int a, b, c;
extern void test();

void CMFCApplication1Dlg::OnBnClickedButtonStart()
{
	// 初期設定
	a = 1;	
	b = 2;	

	// .cを実行
	test();

	// 結果表示
	TRACE("c=%d\n", c);
}

【.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)" は未解決です。
1>D:\TEMP\MFCApplication1\Debug\MFCApplication1.exe : fatal error LNK1120: 4 件の未解決の外部参照

【備考】
ビルド後、.cに対応する.objは一応作られています。
.cの拡張子を.cppに変更すると、ビルドできて期待した動作をします。
できれば.cのまま扱いたいのですが、方法がありますでしょうか。

【環境】Visual Studion 2015 MFCアプリケーション

[ □ Tree ] 返信 編集キー/

▲[ 98284 ] / ▼[ 98298 ]
■98285 / 1階層)  Re[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 形式の名前で参照するようにすることで、リンクできるようになります。
詳しくは「マングリング」で検索してください。

[ 親 98284 / □ Tree ] 返信 編集キー/

▲[ 98285 ] / 返信無し
■98298 / 2階層)  Re[2]: .cppと.cの混在で外部シンボルが未解決
□投稿者/ 身すがら (3回)-(2021/10/29(Fri) 10:17:21)
助かりました。

・個々に"C"をつける
・extern "C"{}で囲う

どちらの方法も、うまくいきました。
「マングリング」の記事、参考になりました。
どうもありがとうございました。

解決済み
[ 親 98284 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -