C言語ではなくてVisual C++の、それもC++に関わる質問になるのですが
ソースコードをビルドする際に
リンカツールエラー LNK2005というエラーが
発生するのですが何故でしょうか?
一応、いろいろ原因を調べてみた結果、
仮想関数か演算子があるクラスを宣言する。
(この時点で中身は書かない。)
↓
そのクラスの中身をスコープを使って実装する。
↓
クラスが実装されているソースファイルを
ほかのソースファイルに読み込む。
↓
エラー発生。
というところまではわかったのですが、いったい何故それがエラーを起こすのか、
Visual C++ デペロッパー センターで調べても全くわかりません。
リンカ ツール エラー LNK2005について
Re:リンカ ツール エラー LNK2005について
これですか?
引用
CRT ライブラリでは、new、delete、および DllMain の各関数で弱い外部リンケージを使用します。MFC ライブラリにも new、delete、および DllMain の各関数が含まれています。これらの関数では、MFC ライブラリを CRT ライブラリより先にリンクする必要があります。
マイクロソフト サポート オンライン
http://support.microsoft.com/default.as ... ;ja;148652
引用
CRT ライブラリでは、new、delete、および DllMain の各関数で弱い外部リンケージを使用します。MFC ライブラリにも new、delete、および DllMain の各関数が含まれています。これらの関数では、MFC ライブラリを CRT ライブラリより先にリンクする必要があります。
マイクロソフト サポート オンライン
http://support.microsoft.com/default.as ... ;ja;148652
Re:リンカ ツール エラー LNK2005について
ソースとエラーコードを書かなくて申し訳ございません。
ソースファイルscene.cppの中身
class Scene
{
public:
virtual void main()=0;
};
class Scene_T:public Scene
{
public:
virtual void main();
};
void Scene_T::main(){
};
ソースファイルmain.cppの中身
#include "bitmap.cpp"
int main(void){
}
エラーメッセージ
main.obj : error LNK2005: "public: virtual void __thiscall Scene_T::main(void)" (?main@Scene_T@@UAEXXZ) は既に bitmap.obj で定義されています。
C:\Users\kimura keigo\Documents\Visual Studio 2008\Projects\実験_2\Debug\実験_2.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。
ソースファイルscene.cppの中身
class Scene
{
public:
virtual void main()=0;
};
class Scene_T:public Scene
{
public:
virtual void main();
};
void Scene_T::main(){
};
ソースファイルmain.cppの中身
#include "bitmap.cpp"
int main(void){
}
エラーメッセージ
main.obj : error LNK2005: "public: virtual void __thiscall Scene_T::main(void)" (?main@Scene_T@@UAEXXZ) は既に bitmap.obj で定義されています。
C:\Users\kimura keigo\Documents\Visual Studio 2008\Projects\実験_2\Debug\実験_2.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。
Re:リンカ ツール エラー LNK2005について
> main.obj : error LNK2005: "public: virtual void __thiscall Scene_T::main(void)" (?main@Scene_T@@UAEXXZ) は既に bitmap.obj で定義されています。
ということは、提示されたソース「の他」に、
bitmap.cpp(maim.cppでインクルードしている)もありますね。
情報を小出しにしないで、バ~ンと一気に出してみませんか?
何となく、main()という名前がダブっているのが気になりますが…。
ということは、提示されたソース「の他」に、
bitmap.cpp(maim.cppでインクルードしている)もありますね。
情報を小出しにしないで、バ~ンと一気に出してみませんか?
何となく、main()という名前がダブっているのが気になりますが…。
Re:リンカ ツール エラー LNK2005について
他にあるというより、「scene.cpp」が「bitmap.cpp」の間違いじゃないですかね。
いずれにせよmain.cppで
#include "bitmap.cpp"
しちゃってるわけだから、
bitmap.cppで定義したものはすべてmain.cppでも定義される。
当然リンクエラーになります。
いずれにせよmain.cppで
#include "bitmap.cpp"
しちゃってるわけだから、
bitmap.cppで定義したものはすべてmain.cppでも定義される。
当然リンクエラーになります。
Re:リンカ ツール エラー LNK2005について
bitmap.cppとscene.cppは同じソースファイルです。
本来bitmap.cppと書くべき場所をscene.cppと書き間違えたしまったのです。
間違いを修正するとこうなります。
ソースファイルbitmap.cppの中身
class Scene
{
public:
virtual void main()=0;
};
class Scene_T:public Scene
{
public:
virtual void main();
};
void Scene_T::main(){
};
ソースファイルmain.cppの中身
#include "bitmap.cpp"
int main(void){
}
エラーメッセージ
main.obj : error LNK2005: "public: virtual void __thiscall Scene_T::main(void)" (?main@Scene_T@@UAEXXZ) は既に bitmap.obj で定義されています。
C:\Users\kimura keigo\Documents\Visual Studio 2008\Projects\実験_2\Debug\実験_2.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。
情報を出すと本来のソースファイルはもっと複雑で長い物なのですが
どこでエラーが起きているかを調べるために、
他のプロジェクトにソースファイルを写して、ソースを書き直していき、
上記のようなLNK2005のエラーを掃くソースを作ったのです。
それで何故このようなソースでエラーを掃くのかがわからないのです。
また、このソースではbitmap.cppをヘッダーファイルに変えても、
Sceneのメンバー関数である、mainを別の名前にしても同じエラーを掃きます。
>ということは、提示されたソース「の他」に、
>bitmap.cpp(maim.cppでインクルードしている)もありますね。
僕が調べる限りbitmap.cppは一つだけのようです。
Sceneクラスのmainを仮想関数でなくするとエラーを掃きませんし・・・。
Visual C++ デベロッパー センターのLNK2005のページを見たのですが、
自分は/clrも/Gyもuuid.libも使用しておらず、ヘッダーファイルで
変数を定義しているわけではありませんのでおそらくは原因は3か4だと
考えているのですが・・・・。
しかし3と4の文章の意味がわからなくて・・・・。
http://msdn.microsoft.com/ja-jp/library/72zdcz6f(VS.80).aspx
本来bitmap.cppと書くべき場所をscene.cppと書き間違えたしまったのです。
間違いを修正するとこうなります。
ソースファイルbitmap.cppの中身
class Scene
{
public:
virtual void main()=0;
};
class Scene_T:public Scene
{
public:
virtual void main();
};
void Scene_T::main(){
};
ソースファイルmain.cppの中身
#include "bitmap.cpp"
int main(void){
}
エラーメッセージ
main.obj : error LNK2005: "public: virtual void __thiscall Scene_T::main(void)" (?main@Scene_T@@UAEXXZ) は既に bitmap.obj で定義されています。
C:\Users\kimura keigo\Documents\Visual Studio 2008\Projects\実験_2\Debug\実験_2.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。
情報を出すと本来のソースファイルはもっと複雑で長い物なのですが
どこでエラーが起きているかを調べるために、
他のプロジェクトにソースファイルを写して、ソースを書き直していき、
上記のようなLNK2005のエラーを掃くソースを作ったのです。
それで何故このようなソースでエラーを掃くのかがわからないのです。
また、このソースではbitmap.cppをヘッダーファイルに変えても、
Sceneのメンバー関数である、mainを別の名前にしても同じエラーを掃きます。
>ということは、提示されたソース「の他」に、
>bitmap.cpp(maim.cppでインクルードしている)もありますね。
僕が調べる限りbitmap.cppは一つだけのようです。
Sceneクラスのmainを仮想関数でなくするとエラーを掃きませんし・・・。
Visual C++ デベロッパー センターのLNK2005のページを見たのですが、
自分は/clrも/Gyもuuid.libも使用しておらず、ヘッダーファイルで
変数を定義しているわけではありませんのでおそらくは原因は3か4だと
考えているのですが・・・・。
しかし3と4の文章の意味がわからなくて・・・・。
http://msdn.microsoft.com/ja-jp/library/72zdcz6f(VS.80).aspx
Re:リンカ ツール エラー LNK2005について
ソースファイルはそもそもインクルードするものじゃないですが。
そのやり方でどうしてもLNK2005を出さないようにしたいのであれば、bitmap.cppをコンパイル対象からはずすように設定しなければなりません。
#include "bitmap.cpp"
int main(void){
}
これは以下と同じになります。
●コンパイルされるときのmain.cppの中身
class Scene
{
public:
virtual void main()=0;
};
class Scene_T:public Scene
{
public:
virtual void main();
};
void Scene_T::main(){
};
int main(void){
}
で、bitmap.cppもコンパイル対象に含まれていると、実質bitmap.cppは2回コンパイルされることになるのでLINK2005になります。
このような場合、以下のようにするのが望ましいです。
bitmap.h
class Scene
{
public:
virtual void main()=0;
};
bitmap.cpp
#include "bitmap.h"
class Scene_T:public Scene
{
public:
virtual void main();
};
void Scene_T::main(){
};
main.cpp
#include "bitmap.h"
int main(void){
}
そのやり方でどうしてもLNK2005を出さないようにしたいのであれば、bitmap.cppをコンパイル対象からはずすように設定しなければなりません。
#include "bitmap.cpp"
int main(void){
}
これは以下と同じになります。
●コンパイルされるときのmain.cppの中身
class Scene
{
public:
virtual void main()=0;
};
class Scene_T:public Scene
{
public:
virtual void main();
};
void Scene_T::main(){
};
int main(void){
}
で、bitmap.cppもコンパイル対象に含まれていると、実質bitmap.cppは2回コンパイルされることになるのでLINK2005になります。
このような場合、以下のようにするのが望ましいです。
bitmap.h
class Scene
{
public:
virtual void main()=0;
};
bitmap.cpp
#include "bitmap.h"
class Scene_T:public Scene
{
public:
virtual void main();
};
void Scene_T::main(){
};
main.cpp
#include "bitmap.h"
int main(void){
}
Re:リンカ ツール エラー LNK2005について
予想通り単一定義規則に違反していることが原因です。
http://www.kijineko.co.jp/tech/how-to-l ... files.html
↑でも読んで、ヘッダファイルを適当に記述・使用してください。
http://www.kijineko.co.jp/tech/how-to-l ... files.html
↑でも読んで、ヘッダファイルを適当に記述・使用してください。