4

私は単純な UDP ソケット クラスを作成して C++ プログラムと Java プログラムの間で会話をしようとしているので、すべての UDP 送信を処理するソケット クラスを作成しようとしていますが、プログラムをコンパイルできません。約 8 個の lnk2019 エラーが発生しますが、それらが何を意味するのかさえわかりません。私は主に Java で作業しており、笑う必要がある場合にのみ C++ を使用します。ソケットヘッダーとコードの 3 つのファイルがあります。また、Udp Socket コードは rFactor-Nesim からのものであるため、ソケット コードは私が作成したものではありません。

UdpSocket.cpp

#include "UdpSocket.hpp"

#include <stdio.h>

UdpSocket::UdpSocket(const char* host, int port) 
: mHost(host), mPort(port)
{
}

UdpSocket::~UdpSocket(void)
{
}

void UdpSocket::Open()
{
if(WSAStartup(MAKEWORD(2, 0), &mWinsockData) != 0)
    fprintf(stderr, "WSAStartup() failed");   

if ((mSocket = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
    perror("socket() failed");   

memset(&mSocketAddress, 0, sizeof(mSocketAddress));
mSocketAddress.sin_family = AF_INET;
mSocketAddress.sin_addr.s_addr = inet_addr(mHost);
mSocketAddress.sin_port = htons(mPort);
}

void UdpSocket::Close()
{
closesocket(mSocket);  
WSACleanup();
}

void UdpSocket::Send(char* str, size_t length)
{
size_t result = sendto(mSocket, str, length, 0, 
    (struct sockaddr *) &mSocketAddress, sizeof(mSocketAddress));

if(result != length)
    perror("sendto() sent incorrect number of bytes");   
}

UdpSocket.hpp

#ifndef UDPSOCKET_HPP
#define UDPSOCKET_HPP

#include <WinSock.h>

class UdpSocket
{
public:
UdpSocket(const char* host, int port);
~UdpSocket(void);

void Send(char* str, size_t length);

void Open();
void Close();
private:
const char* mHost;
int mPort;
int mSocket;
struct sockaddr_in mSocketAddress;
WSADATA mWinsockData;
};

#endif // UDPSOCKET_HPP

そしてメイン

#include "Socket/UdpSocket.hpp"
#include <iostream>


int Main(){
UdpSocket* testSocket = new UdpSocket("127.0.0.1", 27469);
testSocket->Open();
system("pause");
return 0;
}

どんな助けでも素晴らしいでしょう。私はC ++にあまり強くありませんが、少しやったことがあります

コンソール出力:

Error   1   error LNK2019: unresolved external symbol __imp__htons@4 referenced in function "public: void __thiscall UdpSocket::Open(void)" (?Open@UdpSocket@@QAEXXZ)   UdpSocket.obj   SocketTest
Error   2   error LNK2019: unresolved external symbol __imp__inet_addr@4 referenced in function "public: void __thiscall UdpSocket::Open(void)" (?Open@UdpSocket@@QAEXXZ)   UdpSocket.obj   SocketTest
Error   3   error LNK2019: unresolved external symbol __imp__socket@12 referenced in function "public: void __thiscall UdpSocket::Open(void)" (?Open@UdpSocket@@QAEXXZ) UdpSocket.obj   SocketTest
Error   4   error LNK2019: unresolved external symbol __imp__WSAStartup@8 referenced in function "public: void __thiscall UdpSocket::Open(void)" (?Open@UdpSocket@@QAEXXZ)  UdpSocket.obj   SocketTest
Error   5   error LNK2019: unresolved external symbol __imp__WSACleanup@0 referenced in function "public: void __thiscall UdpSocket::Close(void)" (?Close@UdpSocket@@QAEXXZ)    UdpSocket.obj   SocketTest
Error   6   error LNK2019: unresolved external symbol __imp__closesocket@4 referenced in function "public: void __thiscall UdpSocket::Close(void)" (?Close@UdpSocket@@QAEXXZ)   UdpSocket.obj   SocketTest
Error   7   error LNK2019: unresolved external symbol __imp__sendto@24 referenced in function "public: void __thiscall UdpSocket::Send(char *,unsigned int)" (?Send@UdpSocket@@QAEXPADI@Z)  UdpSocket.obj   SocketTest
Error   8   error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup   MSVCRTD.lib SocketTest
Error   9   fatal error LNK1120: 8 unresolved externals C:\Users\Brendan\Documents\Visual Studio 2008\Projects\SocketTest\Debug\SocketTest.exe  SocketTest
4

2 に答える 2

7

Winsock とのリンクに失敗しているようです -Ws2_32.lib

コマンド ラインからビルドする場合は、コマンド ラインに追加Ws2_32.libしますlink

Visual Studio からビルドしている場合は、プロジェクト構成ダイアログ内でリンカー フラグ/設定を探します。

于 2013-02-25T09:15:18.727 に答える
0

いくつかの実装ファイルにコードがある場合、それらすべての実装ファイルをコンパイルし、結果のオブジェクト コード ファイルをリンカーに渡す必要があります。リンカーはそれら (およびその他のもの) を実行可能ファイルに結合します。

モジュールのヘッダーを含めるだけでは不十分です

c++ には (まだ) 技術的なモジュールの概念がないため、ヘッダーをインクルードしても魔法のように実装ファイルがコンパイルされたり、オブジェクト コード ファイルがリンカーに渡されたりすることはありません。

これは C++ 標準の一部ではありませんが、日常のツール使用の一部です

リンカは、オブジェクト コードの提供に失敗したことを通知しています。あなたのクラスメンバー関数Winsock ライブラリ

そのオブジェクト コードはライブラリ ファイルによって提供されます。Visual C++ では通常、ファイル名拡張子は「.lib」です。


一般に、不可解なエラーが発生した場合は、ドキュメントでエラー番号を調べてください。

F1キーを押すだけの簡単なビジュアルスタジオで

于 2013-02-25T09:14:14.220 に答える