Iwao Dev

気付いたことをメモしています.

この画面は、簡易表示です

2020/04/10

LNK2005 すでに ~.obj で定義…

このエラーは,複数のソースファイルに同じ関数などが定義されている場合に発生します.
別の表現をすると,リンク対象の obj や lib に同じ定義が含まれているということです.


次の様な関数のエラーは,プロジェクトの設定に問題があることがあります.

nafxcwd.lib(afxmem.obj) : error LNK2005: “void * __cdecl operator new(unsigned int)” (??2@YAPAXI@Z) はすでに LIBCD.lib(new.obj) で定義されています

https://mish.myds.me/wordpress/dev/?s=lnk2005


他に,自前のコードでヘッダファイルに関数の実態を定義した場合にも発生します.
その場合はソースファイルに移すか,inline 関数として定義します.


以下は個人的なもので,ちょっと異なる使い方で発生した時の対応です.


以前,ソースファイルに定義していたテーブルをヘッダファイルに.

struct	CL_function	{
	LPCTSTR	Lower ;
	int	FType ;
	} ;

CL_function	CL_fnc_tbl[] =	{
	_T("atan2") ,	ATAN2	,
	//  ...
	_T(" ") ,	FERROR	,
	_T("\0") ,	FERROR	,
	} ;
--------------------構成: pf_20 - Win32 Debug--------------------
コンパイル中...
ComPrj01.cpp
コードを生成中...
コンパイル中...
ComUse02.cpp
pf_20.cpp
pf_20Dlg.cpp
コードを生成中...
リンク中...
ComUse02.obj : error LNK2005: "struct CL_function * CL_fnc_tbl" (?CL_fnc_tbl@@3PAUCL_function@@A) はすでに ComPrj01.obj で定義されています
pf_20.obj : error LNK2005: "struct CL_function * CL_fnc_tbl" (?CL_fnc_tbl@@3PAUCL_function@@A) はすでに ComPrj01.obj で定義されています
pf_20Dlg.obj : error LNK2005: "struct CL_function * CL_fnc_tbl" (?CL_fnc_tbl@@3PAUCL_function@@A) はすでに ComPrj01.obj で定義されています
pf_20.exe - エラー 3、警告 0

テーブルを cpp から hpp に移して LNK2005
次の様に static を付けて対応したが,ヘッダには static を書いてはいけない 様な記述が多い.

static	CL_function	CL_fnc_tbl[] =	{
	//  ...
	} ;
この投稿は役に立ちましたか? 役に立った 役に立たなかった 1 人中 0 人がこの 投稿 は役に立ったと言っています。

  にほんブログ村 IT技術ブログへ



    top

    %d人のブロガーが「いいね」をつけました。