error LNK2005とLNK1169 – プログラミング – Home

通知
すべてクリア

error LNK2005とLNK1169


kuma
 kuma
(@kuma)
ゲスト
結合: 21年前
投稿: 32
Topic starter  

VC6.0SP5 XpPro
こんにちは、
すごく単純なミスかもしれませんが、まったく理解できませんでしたので、
どなたかよろしくお願いいたします。

---main.cppーーー
#include Diam.cpp
int main(){
return 0;
}


引用解決済
トピックタグ
kuma
 kuma
(@kuma)
ゲスト
結合: 21年前
投稿: 32
Topic starter  

先ほど間違って送信してしました.

//---main.cpp---
#include Diam.cpp
int main(){
return 0;
}
//---Diam.cpp---
#ifndef DIAM
  #define DIAM
  #include Diam.h
#endif
void Diam::READ(unsigned char IMAGE[256][256], char *FILENAME)
{
  return;
}
//---Diam.h---
class Diam{
public:
  void READ(unsigned char IMAGE[256][256], char *FILENAME);

};

この3つのプログラム(なんの意味もないですが。。。)を実行すると
track.obj : error LNK2005: public: void __thiscall Diam::READ(unsigned char (*
const)[256],char *) (?READ@Diam@@QAEXQAY0BAA@EPAD@Z) はすでに Diam.obj で定義さ
れています
Debug/main.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つ
かりました

と成ります。どのタイミングで定義されているかがよくわからず苦しんでいます。
よろしくお願いいたします。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 600
 

LNK2005 : シンボルの多重定義。複数の実装があって、どれをリンクしていいのか決められな
い。
LNK1169 : 同上。

Diam.cpp の中に main が定義されていませんか?

# リンカが吐いたメッセージを示してください。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 600
 

Diam.cpp と main.cpp をコンパイル/リンクしたのなら、そのエラーが出て'アタリマエ'で
す。


返信引用
島
 島
(@島)
ゲスト
結合: 23年前
投稿: 238
 

>//---main.cpp---
>#include Diam.cpp
>int main(){
> return 0;
>}

#include Diam.cpp があるので、ソースファイル main.cpp にはクラス Diam の
メンバー函数(かんすう)Read() の定義が存在することになるので、main.cpp と
Diam.cpp とに同じもの (Diam::Read()) があることになります
ですから、επιστημη さんの
>Diam.cpp と main.cpp をコンパイル/リンクしたのなら、そのエラーが出て'アタリマエ'で
>す。
ということになるのです

ところで、以下の部分は何のおまじないでしょうか?
>//---Diam.cpp---
>#ifndef DIAM
>  #define DIAM
>  #include Diam.h
>#endif


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 600
 

ところで、以下の部分は何のおまじないでしょうか?
>//---Diam.cpp---
>#ifndef DIAM
>  #define DIAM
>  #include Diam.h
>#endif

.cpp に書いても何の効き目もありませんですねぇ ^^;

# .cpp を #include すること自体、相当にイレギュラーだし


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

> .cpp を #include すること自体、相当にイレギュラーだし

御意。
たまに見ますね、cppファイルをインクルードしているソース。
インクルードするならcppにしなきゃ良いのにと思いますけれど、
通常はcppはインプリメントするためのファイルなのでインクルードするのは
おかしいと思います。
プリコンパイラにしてみれば、単に指定されたファイルを展開するだけなので
エラーにはなりませんからねぇ。
エラーにならないから何をしても良いというのはちょっと違うと思います。


返信引用
こういう事かな
 こういう事かな
(@こういう事かな)
ゲスト
結合: 21年前
投稿: 2
 

結局こうしたいのでは?

// main.h
#ifndef DIAM
#define DIAM
#include Diam.h
#endif

// main.cpp
#include main.h

int main()
{
return 0;
}

// Diam.h
class Diam{
public:
void READ(unsigned char IMAGE[256][256], char *FILENAME);
};

// Diam.cpp
void Diam::READ(unsigned char IMAGE[256][256], char *FILENAME)
{
return;
}

VCなら多重インクルード防止に#pragma onceが使えますね。


返信引用
こういう事かな
 こういう事かな
(@こういう事かな)
ゲスト
結合: 21年前
投稿: 2
 

あ、修正。

// Diam.cpp
#include Diam.h // <-これ必要

void Diam::READ(unsigned char IMAGE[256][256], char *FILENAME)
{
return;
}


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 600
 

…僕は単純に
#include Diam.h を間違えて
#include Diam.cpp にしちゃっただけのことやと思うですが。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました