8

我收到上述全局消息链接器错误

const char* HOST_NAME = "127.0.0.1";

我不认为我已经编译了两次文件,但无论如何这是我对文件的定义。

主文件

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include "connection.hpp"

连接.cpp

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <sys/socket.h>
#include <sys/types.h>
#include <netdb.h>
#include <arpa/inet.h>
#include "connection.hpp"

连接.hpp

#ifndef __connection__
#define __connection__
#include <unistd.h>
#include <netinet/in.h>

const int BUFFSIZE = sysconf(_SC_PAGESIZE);             //Define page size
const char* HOST_NAME = "127.0.0.1";                    //Local host
//Definition of a class
#endif

有什么帮助吗?

4

3 回答 3

33

您对字符串使用了错误的声明。您需要将字符串设为常量,因为常量可能在多个编译单元中定义。这就是为什么编译器不会为BUFFSIZE: BUFFSIZEis const 报告相同的错误,因此它可能会在不同的编译单元中定义多次。但是HOST_NAME不是const,所以报了。HOST_NAME如果您将其声明更改为

const char* const HOST_NAME = "127.0.0.1"; 

然后错误应该消失。


[C++11: 3.5/3]: 具有命名空间范围(3.3.6)的名称如果是

  • 显式声明的变量、函数或函数模板static;或者,
  • const显式声明或constexpr既未显式声明extern也未先前声明具有外部链接的变量;或者
  • 匿名工会的数据成员。

这有效地使常量“本地化”到定义它的每个翻译单元,从而消除了冲突的机会。

于 2014-07-03T16:07:05.263 回答
2

不要以为我把一些文件编译了两次

然而,这正是发生的事情。您已经编译connection.hpp了好几次,每次都将# include它放入某个翻译单元。

要么添加static到声明中,要么添加到声明extern中,删除= somestring部分,并在一个源文件中提供定义。

于 2014-07-03T16:07:47.827 回答
2

您在 connection.cpp 和 main.cpp 中都包含了“connection.hpp”。因此它 ( const char* HOST_NAME = "127.0.0.1";) 在 2 个 cpp 文件中定义。

于 2014-07-03T16:02:29.837 回答