shin'nosuke さんのアレグロモデラート

アレグロモデラート(Allegro moderato)は、速さを示す演奏記号で「穏やかに速く」

LNK2005 VC++


ここ1週間くらい悩んでたんだけど、既存のVisual Studio ソリューションに新しいプロジェクトを追加して、必要なコードを書いて、コンパイルが通るんだが、リンクが通らない。エラーコードはLNK2005で、実体が重複しているという意である。出力ウィンドウ、もしくは、エラー一覧には、msvcrt や libcmtd などを、/NODEFAULTLIB せよ、などと出るから従ってみるのだが、どうしても、僕が書いたコードとは関係のないところで、LNK2005が出続ける。

先述もしたように、LNK2005 は、実体の重複であるから、include の有無や順序の問題ではない。これはちゃんと考えればわかることだし、経験的にもわかっていた。しかし、C++ または、MFCから実に3年ほど遠ざかっていた shin' さんには解決の糸口が見えない。libcmtd 、 msvcrt 、んー、3年前に調べた覚えがあるのだが…。

結局、何がまずいのかを、ソースをコメントアウトしていくことで、順に追っていった。プロジェクトの構成は、MFC のクラスライブラリ(CListとか)を使ってはいるが、WinMain から動くexeファイルを、僕のつくっていないlibと、僕がつくったlib をリンクするという構成。僕がつくったlib をリンクはするが、include しない状況では、リンクは成功するが、include したらリンクが失敗する。ということは、やっぱり僕のつくったlibが悪いんだな。

途方に暮れたあげく、ダメもとで、libcmtd をMSDNライブラリに聞いてみた。すると、このようなページ。

/MD、/MT、/LD (ランタイム ライブラリの使用) (C++)

読む。
プロジェクトプロパティのリンク→コード生成にある、/MD、/MT とかを設定するページが関係あることは、なんとなくわかっている。そしてその下。

リンカの特定の呼び出しに渡されるすべてのモジュールは、同じランタイム ライブラリ コンパイラ オプション (/MD、/MT、/LD) を指定してコンパイルされている必要があります。

もういちど。

リンカの特定の呼び出しに渡されるすべてのモジュールは、同じランタイム ライブラリ コンパイラ オプション (/MD、/MT、/LD) を指定してコンパイルされている必要があります。



もういちど。

リンカの特定の呼び出しに渡されるすべてのモジュールは、同じランタイム ライブラリ コンパイラ オプション (/MD、/MT、/LD) を指定してコンパイルされている必要があります。



そうか!。ランタイムライブラリのリンクのときに、同じ名前の実体が複数あったから、LNK2005が出ていたんだな。ようするに、すべてのlib については、このオプション(/MDとか)が一致していなければならないのか!。そういえば、3年前もそういう感じだった。

ってことで、関連するライブラリをすべて洗い出して、できるかぎり/MDとか/MTのオプションを統一してみたところ、無事、リンクが成功し、めでたく、exeファイルが作られた。


やれやれ。ダメだな、オレ。こんなことに悩んでいるようではいかんぞ。今の現場では、ひっさしぶりに自分でコーディングをしているんだが、どちらかというと苦痛である。グローバルネットに接続されていないので、疑問点をすぐに検索するという、リズムをつかめていないというのも理由のひとつであるようだが、身近な若い子たちに Google 禁止と言おうとしている、僕が情けない。わからないことは、自分で理解<他人に説明できること>するまで調べなければならない。コピー&ペーストに頼りきりではいけない。

どうやら、最近コーディングが楽しくないのは、リズムであるようだな。いまおかれた環境で、僕が最大限にパフォーマンスを発揮できるリズムを実践しましょう。成功体験のアンチエイジングである。



以上、ひさびさのコンピューティングティップスでしたが、追伸。プログラミングわからんひとごめんなさい。shin' さんはやっぱり、システムエンジニアなのですよ。
 
 
 
 
はんほげー。