我不明白一个人的想法。 我有一个名为“ network.h”的头文件,并且带有函数的类声明。 在“ network.cpp”文件中,我具有这些功能。 当要在main.cpp中包括“ network.h”并编译我的项目(Microsoft Visual Studio 2007)时,我收到此消息:

network.obj : error LNK2005: "class networkClass network" (?network@@3VnetworkClass@@A) already defined in main.obj

我知道我们不能例如创建两个相同的变量,但是在此我不知道出了什么问题。

资源:

网络

#ifndef H_NETWORK
#define H_NETWORK

    #include <string>
    #include <SFML/Network.hpp>




    struct getClientsStruct
    {
        std::string nick;
        sf::IpAddress clientIp;

    };

    getClientsStruct receiveClientIfno();

    class networkClass
    {
    public:
        void sendMyInfo();
        void bind();
        getClientsStruct receiveClientIfno();


    };

    networkClass network;


    #endif 

network.cpp

#include <SFML/Network.hpp>
#include "network.h"
#include <iostream>
#include <string>


sf::UdpSocket searchSocket;

//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!





    void sendMyInfo()
    {
        sf::UdpSocket searchSocket;


        std::string myLocalAddress = sf::IpAddress::getLocalAddress().toString();

        char dataSend[100] = "DANE.......";
        sf::IpAddress recipient = "255.255.255.255";
        unsigned short portSending = 54000;
        if (searchSocket.send(dataSend, 100, recipient, portSending) != sf::Socket::Done)
        {
            // error...
            std::cout << "Sending ERROR" << std::endl;
        }
        else
            std::cout << "Sending SUCCESSED" << std::endl;
    }

    void bind()
    {
        // bind the socket to a port
        if (searchSocket.bind(54000) != sf::Socket::Done)
        {
            std::cout << "ERROR binding" << std::endl;
        }
        else
            std::cout << "BIND success" << std::endl;

    }

    getClientsStruct receiveClientIfno()
    {
        getClientsStruct ClientInfo;
        searchSocket.setBlocking(0);
        char dataReceived[100];
        std::size_t received;
        sf::IpAddress sender;
        unsigned short portReceive;






        if (searchSocket.receive(dataReceived, 100, received, sender, portReceive) != sf::Socket::Done)
            {   // error...
                std::cout << "Receive ERROR" << std::endl;
            }



        std::cout << "Received " << received << " bytes from " << sender << " on port " << portReceive << std::endl;


        return ClientInfo;

    }

- - - - - - - - - - - - - - - - - 编辑 - - - - - - - - ----------------------

因此,我删除了networkClass network; 从network.h并在main.cpp中声明。 现在,当我想要运行功能时,例如network.bind(); 我收到错误: main.obj : error LNK2019: unresolved external symbol "public: void __thiscall networkClass::bind(void)" (?bind@networkClass@@QAEXXZ) referenced in function _main

===============>>#1 票数:2 已采纳

标头应包含在多个编译单元(cpp文件)中。 不幸的是,您在network.h定义了一个全局对象network 因此,它将被声明多次(一次是在编译network.cpp时,另一次是在编译main.cpp时)。

全局变量(如果不能通过其他方式避免它们)应该仅以extern的形式出现在标题中:

    extern networkClass network;  // you say this variable exist somewhere else

然后,您必须将定义放入一个cpp文件中。 顺便说一句,如果您的类不是绝对需要它,则不应在类标题中定义它。 而是在main.cpp中定义它。 而且,如果您完全可以避免使用全局变量,请摆脱它。

您在network.cpp遇到的另一个问题是您的语法定义了独立于全局类的全局函数。 每当在类之外定义类函数时,都必须在其名称前加上类名称。 例如:

void networkClass::bind()  // say which class the function is a member
...

===============>>#2 票数:1

您很可能已经完成了两个单独的编译。 network.cpp一个编译,可能还有main()函数的另一个编译。

在“ network.h”中,声明变量

networkClass network;

因此,如果在源代码中包含main()函数的头文件network.h ,则编译器将读取变量network作为实例。

但是然后,在链接期间,在network.omain.o都检测到变量网络已重复。

您应该在network.h指定

extern networkClass network;

然后在network.cpp实例化它(如果您打算这样做,则将其实例化为全局变量)。

  ask by BartQ translate from so

未解决问题?本站智能推荐:

1回复

SFML网络错误:链接时未定义引用des

我最近开始学习SFML,但是进入“网络”部分时,总是会遇到很多错误: 我正在使用CodeBlocks,编译器参数为: 仅当我使用网络功能时,才会发生这种情况(但我没有尝试过音频)。 提前致谢。 编辑:这是我的代码:
1回复

使用SFML的HTTP类下载进度?

因此,我想知道在使用SFML的HTTP类/通常使用HTTP时获得下载进度的一种好方法。 我认为能够做到这一点的唯一方法是在单独的线程中使用大量的远程GET请求,但是ofc使得所有请求和所有请求的下载时间更长。 有任何想法吗?
1回复

SFML网络和我(C ++)[关闭]

我想你们熟悉SFML? SFML在制作游戏和其他应用程序方面很有用,但我想知道在网络中应用它是否值得? 就像我要用SFML制作一个数据包嗅探器一样,这是一个愚蠢的选择,因为SFML并不适用于这类事情。
1回复

带有SFML 2.4(C ++)的链接错误

一段时间以来,我一直在尝试将SFML库用于C ++。 但是,每当我尝试运行程序时,都会出现大量围绕未定义符号的构建错误。 我是从Visual Studio构建的,已将include目录,其他库以及bin中的所有DLL添加到了源目录和构建目录中。 尽管如此,我仍然无法构建程序。 我的代
1回复

C ++ Visual Studio 2012链接器错误?

我是C ++的新手,我正在使用SFML设置项目,效果很好,根据Visual Studio,我没有任何代码问题,但是在调试时,我收到了以下错误消息: 错误1错误LNK2019:无法解析的外部符号“ __declspec(dllimport)公共:__thiscall sf :: Stri
2回复

无法使用C ++和SFML 2.1将图像文件加载为纹理

我正在尝试使用SFML 2.1,C ++和MS Visual Studio Professional 2013将图像输出到屏幕上。尝试将文件加载到纹理中时遇到意外错误。 它输出一大堆随机字符。 我确定这是我如何使用Visual Studio配置SFML库还是代码有问题。 谁能解决这个问题?
1回复

使用SFML加载纹理时,Visual C ++项目意外崩溃

我正在尝试使用SFML在Visual Studio中使用C ++开发2D游戏。 我按照SFML网站上的所有设置说明进行操作,并能够通过其说明在窗口中绘制绿色圆圈。 但是,当尝试从文件中加载纹理/图像时,程序崩溃了,我不确定。 C ++ Main.cpp 错误输出 我将S
1回复

如何将SFML源代码包含到我的Visual Studio 2017 C ++项目中并进行编译

我一直在使用sfml库在c ++中编写游戏。 但是,我想调整该库的某些代码,并在项目中使用更改后的代码。 因此,我不想链接dll,而是要添加源代码,然后使用该源代码进行播放。 (例如,用于速度优化)。 我知道做这样的事情通常来说是个坏主意。 但是,我想学习一下,尝试一些不同的事
1回复

其他人如何在没有Visual Studio的情况下运行我的SFML / C ++项目?

我已经建立了仅一个C ++文件的SFML项目。 无论有没有Visual Studio,它都可以在我的计算机上正常工作。 我选择了发布x86选项,然后压缩了发布文件夹并将其发送给无法运行它的朋友。 他们收到一个错误消息,指出“由于计算机缺少MSVCP140.dll,因此无法启动该程序。请尝试
1回复

SFML 2.2未处理的异常位于0x00007FFA622C21F9(sfml-system-2.dll)

我正在尝试在Windows 10下的sfml中构建游戏,它在构建时显示成功。每当我调试解决方案时,它都会显示如下错误消息: 在调用堆栈下,程序停止在代码处: 这是我的代码: