在类声明外定义函数体不是在编译

时间:2017-06-23 13:07:13

标签: c++ winsock2

我试图定义在类中声明的函数(在头文件.h文件中)。但是这个分离的定义仍然存在编译问题。无论它是在带有声明的相同文件中还是在单独的.cpp中,它仍然会返回这些相同的错误

  

|| === Build:在Server中调试(编译器:GNU GCC编译器)=== |

     

obj \ Debug \ SocketManager.o ||函数

     

`ZN13SocketManager12setUpWINSOCKEv':|

     

J:\ CodeBlocksProjects \ Server \ SocketManager.h | 18 |未定义引用

     

`调用WSAStartup @ 8' | ||错误:ld返回1退出状态| || === Build

     

失败:2个错误,0个警告(0分钟,0秒(秒))=== |

#include <iostream>
#include <winsock2.h>

using namespace std;

class SocketManager
{
private:
   WSADATA wsaData;
public:
   void setUpWINSOCK();
   SocketManager(int = 27015, string = "127.0.0.1");
};

void SocketManager::setUpWINSOCK()
{
int result = WSAStartup( MAKEWORD( 2, 2 ), & wsaData );
if( result != NO_ERROR )
   cout<<"Initialization error.\n"<<endl;
}

稍微改变它的compilling,但我想在diffrent .cpp文件中使用分离的定义

#include <iostream>
#include <winsock2.h>

using namespace std;
class SocketManager
{
private:
   WSADATA wsaData;
public:
   void setUpWINSOCK()
   {
      int result = WSAStartup( MAKEWORD( 2, 2 ), & wsaData );
      if( result != NO_ERROR )
         cout<<"Initialization error.\n"<<endl;
   }
   SocketManager(int = 27015, string = "127.0.0.1");
};

我知道我可能搞乱了一些非常基本的东西,但我不知道如何搜索这个。我是Cpp的新手,即使我认识Java 它没有帮助解决这类错误。也很抱歉我的英语,我不习惯以书面形式使用它。我以前从未在任何其他论坛上提出过任何问题。这就是为什么我要求耐心:)

感谢所有帮助和链接。

1 个答案:

答案 0 :(得分:0)

WSAStartup@8是一个C ++错位名称。但是winsock库导出了一个C函数WSAStartup。你之前(或者说)包含了“winsock.h”或“winsock2.h”头文件的某个地方定义了WSAStartup的原型。

删除错误的原型将解决此链接器问题。

进一步确保您与ws2_32.lib链接。