2007年02月07日

リンク出来ない!?

2日程引っ掛かったのでメモ。

自作の静的ライブラリをプログラムにリンクしようとして問題が発生した。いや、コンパイルは通るのだが、リンクでコケるのだ。

以下、Visual C++ 2005 Express Editionで起きたリンクエラー。

msvcprtd.lib(MSVCP80D.dll) : error LNK2005: "public: char const * __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::c_str(void)const " (?c_str@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEPBDXZ) は既に HOGEHOGE.lib(PIYOPIYO.obj) で定義されています。

何じゃコリャ。訳が分からん。うーん……

調べてみると、msvcprtd.libはVC++2005EEのC++用のマルチスレッドDLLインポートライブラリ。std::string::c_str()が多重に定義されている……ねぇ、標準ライブラリがヘンだと言われましても……

待てよ、そういえばstd::stringstd::basic_stringtypedefで、std::basic_stringはテンプレートクラスだ……。テンプレート関係はテンプレート引数の型が決まる(コンパイル時)迄バイナリコードは作りようが無い筈……つまり自作ライブラリ作成時に生成されたstd::stringのコードと今回のプログラム内のstd::stringのコードが、全く同じ内容なのに別の(同名の)クラスと捉えられている……という事か!?






…………って、ンな訳無いだろ!
いくらなんでも。そんなとんでもなく不便な。……うーーん?

……今にして思えば、ここでもうドツボ。簡単に解決できるだろうとタカを括っていたのが災いしてしまった。

2日試行錯誤しても一向に解決しないので、しぶしぶGoogle先生にお伺いを立ててみた。

スタティックライブラリ作成時の「使用するランタイムライブラリ」(*1)と
使用側の「使用するランタイムライブラリ」が一致してない場合にこのエラーが出ます。

回避方法としては、使用側の「使用するランタイムライブラリ」と同じ値を
スタティックライブラリ側の「使用するランタイムライブラリ」に指定します。


*1 : 「プロジェクトの設定」→「C/C++」→「コード生成」の所にあります。

げ、設定!?そんな設定弄った記憶無いんだが……

調べてみると、ヤッパリその通り。うーん、何時変わったんだろう……

教訓

  • 意地を張らずにサッサとググれ
  • 弄った記憶が無い部分も疑え
ラベル:C C++ Visual_C++
posted by 天井冴太 at 20:19| Comment(0) | TrackBack(0) | Study | 更新情報をチェックする
この記事へのコメント
コメントを書く
コチラをクリックしてください

この記事へのトラックバック
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。