我偶然得到已经在.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重复投票前,因为这只是意味着斩首我毫不手软。
这不是一个编译器错误:错误是从连接器的到来。 编译后,连接器将合并从每个翻译单元(的汇编后的目标文件.cpp
文件)。
链接器找到了,你有不同的翻译单位多次定义相同的符号,并抱怨它(这是一个违反了一个定义规则)。
原因是最肯定的是main.cpp
包括client.cpp
,和这两个文件分别由编译器处理以产生两个单独的目标文件。 因此,在所限定的所有的符号client.cpp
翻译单元也将被在定义main.cpp
翻译单元。 这就是为什么你不一般的原因之一#include
.cpp
文件。
把你的类的定义在一个单独的client.hpp
这不同时包含的是类的成员函数的定义文件; 然后,让client.cpp
和main.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"
你可能不希望这样做:
#include "client.cpp"
A * .cpp文件将被编译,编译器作为构建的一部分。 将其包含在其他文件,它会再次在你包括它的每一个文件编译(又一次!)。
现在,这里的东西:你与守护着它#ifndef SOCKET_CLIENT_CLASS
,但是,每个已文件#include "client.cpp"
独立 ,因此建会发现SOCKET_CLIENT_CLASS
尚未确定。 因此它的内容将被列入,而不是#ifdef'd出来。
如果它包含在所有的任何定义(而不仅仅是声明),那么这些定义将在每一个地方它包含的文件重复。
这是解决这个问题的方法之一。
- 只要把在头文件中的原型,并包括在.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()