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

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

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

Re[2]: .cppと.cの混在で外部シンボルが未解決


(過去ログ 170 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■98284 / inTopicNo.1)  .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アプリケーション

引用返信 編集キー/
■98285 / inTopicNo.2)  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 形式の名前で参照するようにすることで、リンクできるようになります。
詳しくは「マングリング」で検索してください。

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

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

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

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -