在.OBJ已定义 - 没有双夹杂物(Already defined in .obj - no dou

2019-07-21 15:35发布

我偶然得到已经在.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"

client.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: “市民:布尔__thiscall SocketClient ::阅读 (INT,CHAR *)” 已经在client.obj 定义 (读@ SocketClient @@ QAE_NHPAD @ Z?)

值得注意的是抱怨我的课,而不是提高。 有趣的是,当我删除#include <boost/asio.hpp>client.cpp,我thouhg 它包含在main.h也出现错误。

正如你所看到的,我不是一倍定义/包括我的课,它包含在main.h 一次 。 所以,这是怎么回事吗?
我看了这个答案 ,但它是没有帮助的,因为它预计双夹杂物。 以这个事实为osideration重复投票前,因为这只是意味着斩首我毫不手软。

Answer 1:

这不是一个编译器错误:错误是从连接器的到来。 编译后,连接器将合并从每个翻译单元(的汇编后的目标文件.cpp文件)。

链接器找到了,你有不同的翻译单位多次定义相同的符号,并抱怨它(这是一个违反了一个定义规则)。

原因是最肯定的是main.cpp包括client.cpp ,和这两个文件分别由编译器处理以产生两个单独的目标文件。 因此,在所限定的所有的符号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

client.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"


Answer 2:

你可能不希望这样做:

#include "client.cpp"

A * .cpp文件将被编译,编译器作为构建的一部分。 将其包含在其他文件,它会再次在你包括它的每一个文件编译(又一次!)。

现在,这里的东西:你与守护着它#ifndef SOCKET_CLIENT_CLASS ,但是,每个已文件#include "client.cpp" 独立 ,因此会发现SOCKET_CLIENT_CLASS尚未确定。 因此它的内容将被列入,而不是#ifdef'd出来。

如果它包含在所有的任何定义(而不仅仅是声明),那么这些定义将在每一个地方它包含的文件重复。



Answer 3:

这是解决这个问题的方法之一。

  • 只要把在头文件中的原型,并包括在.cpp文件的头文件,如下图所示。

client.cpp

#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

client.h

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

main.cpp中

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

main.h

int main()


文章来源: Already defined in .obj - no double inclusions