1. ホーム
  2. c++

[解決済み] 既に.objで定義されている-二重包含はない

2022-01-22 06:06:02

質問

already defined in .obj というエラーが発生しました。これは私のプロジェクトの構造です。

main.cpp

#include "main.h";

main.h

#include <iostream>
#include <string>
#include <sstream>
#include <boost/asio.hpp>
#include <boost/thread/thread.hpp>
#include "client.cpp"

クライアント.cpp

#ifndef SOCKET_CLIENT_CLASS
#define SOCKET_CLIENT_CLASS
#ifndef BOOST_ASIO_HPP
#include <boost/asio.hpp>
#endif
/*CLASS DEFINITION HERE*/
#endif

これは、コンパイラが文句を言っているところです。

main.obj : エラー LNK2005: "public: bool __thiscall SocketClient::read (int,char *)" (?read@SocketClient@QAE_NHPAD@Z) すでに定義されている client.objにあります。

ブーストではなく、私のクラスに対して文句を言っていることに注意してください。ひとつ興味深いのは #include <boost/asio.hpp> から client.cpp しかし、次のようなエラーが発生します。 はmain.hにも含まれています。 .

見ての通り、クラスを二重に定義したり、インクルードしているわけではありません。 一度だけ main.h . では、ここで何が起こっているのか?
を読みました。 この回答 しかし、二重包含を期待しているため、役に立ちませんでした。このことを考慮した上で、重複投票をしてください。

解決方法は?

これは コンパイラ エラー: エラーは リンカ . コンパイルの後、リンカは各翻訳ユニット(訳注: 原文と訳文が同じ)のコンパイルの結果得られたオブジェクトファイルをマージします。 .cpp ファイル)を作成します。

リンカが、異なる翻訳単位で同じシンボルを複数回定義していることを発見し、文句を言う(One Definition Ruleの違反である)。

その理由は、最も確実なのは main.cpp が含まれます。 client.cpp を生成し、これらのファイルはコンパイラによって個別に処理されて 2 は別々のオブジェクトファイルです。従って client.cpp の翻訳ユニットでも定義されます。 main.cpp という翻訳単位があります。このことが、通常は #include .cpp ファイルを作成します。

クラスの定義は、別の client.hpp を行うファイルです。 ではなく には、そのクラスのメンバ関数の定義も含まれています。 client.cppmain.cpp はそのファイルをインクルードします(つまり #include ). 最後に client.cpp には、クラスのメンバ関数の定義が含まれています。

client.h

#ifndef SOCKET_CLIENT_CLASS
#define SOCKET_CLIENT_CLASS
#ifndef BOOST_ASIO_HPP
#include <boost/asio.hpp>
#endif

class SocketClient // Or whatever the name is...
{

// ...

    bool read(int, char*); // Or whatever the name is...

//  ...
};

#endif

クライアント.cpp

#include "Client.h"

// ...

bool SocketClient::read(int, char*)
{
    // Implementation  goes here...
}

// ... (add the definitions for all other member functions)

main.h

#include <iostream>
#include <string>
#include <sstream>
#include <boost/asio.hpp>
#include <boost/thread/thread.hpp>
#include "client.h"
//              ^^ Notice this!

main.cpp

#include "main.h"