リンカ ツール エラー LNK2005について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
KKXY

リンカ ツール エラー LNK2005について

#1

投稿記事 by KKXY » 15年前

C言語ではなくてVisual C++の、それもC++に関わる質問になるのですが
ソースコードをビルドする際に
リンカツールエラー LNK2005というエラーが
発生するのですが何故でしょうか?
一応、いろいろ原因を調べてみた結果、

仮想関数か演算子があるクラスを宣言する。
(この時点で中身は書かない。)

そのクラスの中身をスコープを使って実装する。

クラスが実装されているソースファイルを
ほかのソースファイルに読み込む。

エラー発生。

というところまではわかったのですが、いったい何故それがエラーを起こすのか、
Visual C++ デペロッパー センターで調べても全くわかりません。

たかぎ

Re:リンカ ツール エラー LNK2005について

#2

投稿記事 by たかぎ » 15年前

ソースも正確なエラーメッセージも不明なので推測の域を出ませんが...

おそらくは単一定義規則に違反していることが理由です。

トントン

Re:リンカ ツール エラー LNK2005について

#3

投稿記事 by トントン » 15年前

これですか?


引用
CRT ライブラリでは、new、delete、および DllMain の各関数で弱い外部リンケージを使用します。MFC ライブラリにも new、delete、および DllMain の各関数が含まれています。これらの関数では、MFC ライブラリを CRT ライブラリより先にリンクする必要があります。

マイクロソフト サポート オンライン
http://support.microsoft.com/default.as ... ;ja;148652

KKXY

Re:リンカ ツール エラー LNK2005について

#4

投稿記事 by KKXY » 15年前

ソースとエラーコードを書かなくて申し訳ございません。

ソースファイル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 つ以上の複数回定義されているシンボルが見つかりました。

box

Re:リンカ ツール エラー LNK2005について

#5

投稿記事 by box » 15年前

> main.obj : error LNK2005: "public: virtual void __thiscall Scene_T::main(void)" (?main@Scene_T@@UAEXXZ) は既に bitmap.obj で定義されています。

ということは、提示されたソース「の他」に、
bitmap.cpp(maim.cppでインクルードしている)もありますね。

情報を小出しにしないで、バ~ンと一気に出してみませんか?

何となく、main()という名前がダブっているのが気になりますが…。

pie

Re:リンカ ツール エラー LNK2005について

#6

投稿記事 by pie » 15年前

他にあるというより、「scene.cpp」が「bitmap.cpp」の間違いじゃないですかね。

いずれにせよmain.cppで
#include "bitmap.cpp"
しちゃってるわけだから、
bitmap.cppで定義したものはすべてmain.cppでも定義される。
当然リンクエラーになります。

KKXY

Re:リンカ ツール エラー LNK2005について

#7

投稿記事 by KKXY » 15年前

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

Mist

Re:リンカ ツール エラー LNK2005について

#8

投稿記事 by Mist » 15年前

ソースファイルはそもそもインクルードするものじゃないですが。

そのやり方でどうしても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について

#9

投稿記事 by たかぎ » 15年前

予想通り単一定義規則に違反していることが原因です。
http://www.kijineko.co.jp/tech/how-to-l ... files.html
↑でも読んで、ヘッダファイルを適当に記述・使用してください。

KKXY

Re:リンカ ツール エラー LNK2005について

#10

投稿記事 by KKXY » 15年前

Mistさんの言う通りにやってみたら解決しました。
どうもありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る