初めまして。
初心者特有の無理解からくるものとは存じてますが、リンカエラーが出てしまって困っています。
あるプロジェクト(複数のダイアログで構成)で、どのダイアログからでも呼び出せる関数が必要だったのでヘッダーファイルを自作し、プロジェクトへ追加しました。
最初は問題なかったのですが、突然
「LNK2005:Foo(class CStatic *,int)" (?Foo@@YAXPAVCStatic@@H@Z) はすでに HOGEHOGEDlg.obj で定義されています」
というエラーが出まくってしまい、MSDNのhttp://support.microsoft.com/default.aspx?scid=kb;ja;148652#kb2を試してみたり色々調べていたのですが
どうにも治ってくれないのです。
(ちなみにFoo(class CStatic *,int)というのが自作ヘッダーファイルで作った関数です)
どうかご助言よろしくお願いいたします。
問題となってるヘッダを見せてくれないと判断できません。
そのヘッダーに関数の定義(処理の中身)が書いてあるのでは?
お返事ありがとうございます。
dairygoodsさんのおっしゃる通り、ヘッダーに関数本体の処理を記述しております。どうやらそれがいけないようですね。。。
επιστημηさん、ヘッダーの内容といいますのが今手元にないので微妙に違うかもしれませんが、
aaa.h
-----------------------------------------------
#ifndef AAAH
#define AAAH
void Foo(CStatic* a, int b)
{
int c = 0;
switch(b) {
case 0:
c = 10;
break;
case 1:
c = 20;
break;
default:
break;
}
CFont font = CreateFont(c,・・・);
a.SetFont(&font, true);
a.DeleteObject();
}
#endif
-----------------------------------------------
という感じです。
上のヘッダを、複数あるダイアログのcppファイルから
呼び出して関数を使いたいと考えていました。
なぜこのようにしたかというと、現在は仕事の都合上VC6.0を使用していますが、以前はC++Builderを使用していて、そのときはこのようにして関数を共通化していたので同じようにできるだろうと考えていました。
上のヘッダに対応したcppファイルを作成して、関数本体をそちらに書いてみたらいいのかな?と解釈しておりますが・・・
もし認識が誤っているようでしたらご指摘ください。
解答くださりありがとうございました。
ヘッダは宣言するところ。定義(実装)してはいけません。
そのヘッダが複数回#includeされたら、文字通り多重定義となります。
そうなんですか。
・・・しかしよくよく考えてみれば確かに
ヘッダに関数定義は普通しませんよね。。。
Builderで当たり前のようにやっていたことだったので
まったく認識不足だったようです。
(なぜBuilderでは大丈夫だったのかが不思議です)
この件で悩んで何日か潰してしまったので^^;
ようやく解決の糸口が見えてきたみたいです。
解答ありがとうございました。
>(なぜBuilderでは大丈夫だったのかが不思議です)
メンバ関数だった(inline)から、もしくはそれを
#includeしていたのがひとつであったから。
追加報告
教えていただいた通り、ヘッダに合わせてcppファイルをひとつ作成し、そちらに関数本体の定義を記述することによってリンカエラーが出なくなりました。
それだけの確認に午前いっぱいかかってしまったわけですが。。。;
グローバル変数の定義などもcppファイルでやらないと同じようにエラーが出ますね(当然ですね)
これでやっと先へ進めます・・・ご教示本当にありがとうございました。
>επιστημηさん
Builderで使用していたときはやはり複数のcppファイルからincludeしていましたので、
メンバ関数だったのかもしれません。他所では「サイズの最適化をしているのではないか」
という意見も聞かれました。(恥ずかしながら意味はよくわかっておりませんが)
ツイート | ![]() |