あわせて読みたいブログパーツ
2009年02月14日

"LNK2019: 未解決の外部シンボルのエラー"ではまる

テーマ:技術 - 未分類
C言語って難しいですね。
"LNK2019: 未解決の外部シンボルのエラー"が発生して、はまっております。
dllプロジェクトから、自作のlibファイルで定義しているクラスを参照しているだけなんですが・・・。

かれこれ、2時間程はまっております。解決の兆しは中々見えず。
こういうとき、C言語に精通した(特にVC周り)師匠や友人が居てくれたらと思ってしまいます。

決しました。
蓋を開けてみれば単純な問題でした。

dll側の文字セットがUNICODEになっていたのに対し、ライブラリ側がマルチバイト文字になっていたことが原因です。

順を追って解説していきます。

1. ライブラリにWindowクラスが定義されており、コンストラクタが以下のように宣言されています。
リスト1
Window(HWND hWndParent
,LONG style
,LONG exStyle
,const tstring& title
,int x
,int y
,int width
,int height);


2. 第4引数のtstringは以下のように宣言されています。
リスト2
// マルチバイト文字セットとUNICODE文字の両方に対応したstringオブジェクト
typedef basic_string<TCHAR> tstring;

 TCHARとは、マルチバイト文字セットとUNICODE文字セットの両方に対応可能なように定義された型のことです。
 ※プリプロセッサでUNICODEが定義されているか否かでcharとするかWCHARとするかを変えている。

3. dll側で以下のようにWindowクラスのコンストラクタを呼び出しています。
 ※TEXTマクロはUNICODEが定義されているか否かで、WCHARとするかcharとするかを変える効果があります。
リスト3
Window(NULL
, WS_POPUP
| WS_VISIBLE
, WS_EX_LAYERED
, TEXT("タイトル")
, 0
, 0
, 100
, 100)

原因は最後に書いた「3」にあります。

ライブラリ側とdll側で異なる文字セットを使用していたために、ライブラリ側では、tstring = basic_string<char>と解釈され、dll側では、tstring = basic_string<WCHAR>と解釈されてしまったようです。

型が一つでも違うと、リンカは関数を検出できなくなってしまうため"LNK2019: 未解決の外部シンボルのエラー"が発生していた訳です。

意訳すると「そんなやついねーよ!\(*`∧´)/」と。

工夫次第で解決方法は色々あるのかもしれませんが、ここは手堅くdll側の文字セットをライブラリ側と同じマルチバイト文字セットにすることでエラーを回避しました。

参考サイト:
http://www.nitoyon.com/vc/reference/error.htm
http://msdn.microsoft.com/ja-jp/library/799kze2z(VS.80).aspx

コメント

[コメントをする]

1 ■ありがとう!

この記事のおかげで救われた!!!
エラーが40個でていて、プロジェクト削除しようとしていたところだった。。。

2 ■Re:ありがとう!

>TaniDaiさん
お役に立ててうれしいです。中学生でC++ですか。将来が楽しみですね!プログラムがんばってください。

コメント投稿

一緒にプレゼントも贈ろう!

Amebaおすすめキーワード