2016-06-28 91 views
0

既存のC++アプリケーション(VS2005でも書かれている)にスレッドを統合するために、VS2005に小さなCLRライブラリー(MyClient)を作成しました。私がプロジェクトをビルドするときには、次のエラーが発生します。エラーLNK2019:未解決の外部シンボル(小ライブラリー)

1>PSR_CRSDlg.obj : error LNK2019: unresolved external symbol "public: static void __cdecl MyClient::StartClientThread(void)" ([email protected]@@SAXXZ) referenced in function "public: void __thiscall CPSR_CRSDlg::OnBnClickedInit2(void)" ([email protected][email protected]@QAEXXZ) 
1>PSR_CRSDlg.obj : error LNK2019: unresolved external symbol "public: static void __cdecl MyClient::SendJointValues(double *)" ([email protected]@@[email protected]) referenced in function "public: void __thiscall CPSR_CRSDlg::OnTimer(unsigned int)" ([email protected][email protected]@[email protected]) 
1>PSR_CRSDlg.obj : error LNK2019: unresolved external symbol "public: static void __cdecl MyClient::StopConnection(void)" ([email protected]@@SAXXZ) referenced in function "public: void __thiscall CPSR_CRSDlg::OnBnClickedMovepenall(void)" ([email protected][email protected]@QAEXXZ) 
1>D:\Desktop\PSR\Software\Source - June 21\PSR_CRS_SVN - Copy (2)\Debug\PSR_CRS.exe : fatal error LNK1120: 3 unresolved externals 

私はC++とOOPの新機能ですが、ここ数週間継続しています。これは私の.hファイルである:

using namespace std; 
class MyClient 
{ 
public: 
    static char* createMsg(string s); 
    static char* parseJSON(double j1, double j2, double j3, double j4, double j5, double j6); 
    static void StartConnection(); 
    static void StartClientThread(); 
    static void StopConnection(); 
    static void SendJointValues(double *joints); 
}; 

私の.cppファイルがちょうどするchar * MyClientという:: createMsg(文字列s)などとしてインスタンス化機能を持っているので、私はそれが問題ではないと思います。私はまた、ほとんどのリンクhereを調べて、私のライブラリがすべてそこにあって、循環ライブラリの依存性、ライブラリの順序などがないことを確認するために多くを探しました。私の全体的な解決策の3つのプロジェクトのうち、ランタイムサポート "ですが、私のクライアントライブラリは"共通言語ランタイムサポート "を使用していますが、これはライブラリ間の1つの違いです。

これらのエラーが発生している理由について考えている人はいますか?

フルクライアントライブラリ:

#define WIN32_LEAN_AND_MEAN 
#define NOMINMAX 

#include "stdafx.h" 
#include <winsock2.h> 
#include <windows.h> 
#include <ws2tcpip.h> 
#include <stdlib.h> 
#include <iostream> 
#include <typeinfo> 
#include <sstream> 
#include "Client.h" 

using namespace std; 
using namespace System; 
using namespace System::Threading; 

// Need to link with Ws2_32.lib, Mswsock.lib, and Advapi32.lib 
#pragma comment (lib, "Ws2_32.lib") 
#pragma comment (lib, "Mswsock.lib") 
#pragma comment (lib, "AdvApi32.lib") 

#define DEFAULT_BUFLEN 4096 
#define DEFAULT_PORT "9001" 


char recvbuf[DEFAULT_BUFLEN]; 
int iResult; 
int recvbuflen = DEFAULT_BUFLEN; 
SOCKET ConnectSocket; 

char* MyClient::createMsg(string s) { 
    char *a = new char[s.size() + 1]; 
    a[s.size()] = 0; 
    memcpy(a, s.c_str(), s.size()); 
    return a; 
} 

char* MyClient::parseJSON(double j1, double j2, double j3, double j4, double j5, double j6) 
{ 
    ostringstream oss; 
    oss << j1 << ',' << j2 << ',' << j3 << ',' << j4 << ',' << j5 << ',' << j6; 
    string joints = oss.str(); 
    return createMsg(joints); 
} 

void MyClient::StartConnection() 
{ 
    //printf("Connection Starting... \n"); 
    WSADATA wsaData; 
    ConnectSocket = INVALID_SOCKET; 
    struct addrinfo *result = NULL, 
        *ptr = NULL, 
        hints; 

    int argc = 2; 

    // Validate the parameters 
    if (argc != 2) { 
     printf("usage: %s server-name\n", "client"); 
     return; 
    } 

    // Initialize Winsock 
    iResult = WSAStartup(MAKEWORD(2,2), &wsaData); 
    if (iResult != 0) { 
     printf("WSAStartup failed with error: %d\n", iResult); 
     return; 
    } 

    ZeroMemory(&hints, sizeof(hints)); 
    hints.ai_family = AF_UNSPEC; 
    hints.ai_socktype = SOCK_STREAM; 
    hints.ai_protocol = IPPROTO_TCP; 

    // Resolve the server address and port 
    //iResult = getaddrinfo(argv[1], DEFAULT_PORT, &hints, &result); 
    iResult = getaddrinfo("localhost", DEFAULT_PORT, &hints, &result); 
    if (iResult != 0) { 
     printf("getaddrinfo failed with error: %d\n", iResult); 
     WSACleanup(); 
     return; 
    } 

    // Attempt to connect to an address until one succeeds 
    for(ptr=result; ptr != NULL ;ptr=ptr->ai_next) { 

     // Create a SOCKET for connecting to server 
     ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, 
      ptr->ai_protocol); 
     if (ConnectSocket == INVALID_SOCKET) { 
      printf("socket failed with error: %ld\n", WSAGetLastError()); 
      WSACleanup(); 
      return; 
     } 

     // Connect to server. 
     iResult = connect(ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen); 
     if (iResult == SOCKET_ERROR) { 
      closesocket(ConnectSocket); 
      ConnectSocket = INVALID_SOCKET; 
      continue; 
     } 
     break; 
    } 

    freeaddrinfo(result); 

    if (ConnectSocket == INVALID_SOCKET) { 
     printf("Unable to connect to server!\n"); 
     WSACleanup(); 
     return; 
    } 
    return; 
} 

void MyClient::StopConnection(){ 
    closesocket(ConnectSocket); 
    WSACleanup(); 
    return; 
} 

void MyClient::SendJointValues(double *joints){ 
    char *j; 
    iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0); 
    j = parseJSON(joints[0],joints[1],joints[2],joints[3], \ 
     joints[4],joints[5]); 
    int x = send(ConnectSocket, j, strlen(j), 0); 
    //iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0); 
} 

void MyClient::StartClientThread() 
{ 
    Thread^ cln; 
    ThreadStart ^ClientThread = gcnew ThreadStart(&MyClient::StartConnection); 
    cln = gcnew Thread(ClientThread); 
    cln->IsBackground = true; 
    cln->Start(); 
} 

編集:私は、アプリケーションと同じ設定は私がしている、今と統合しようとしているダミーのアプリケーションを作成したときこれらのエラーは発生しませんでしたなぜ私は何が変わったのか、エラーを解決する方法がわからないのですか?

+0

誰かがこの複製を閉じる前に、インターネットで "lnk2019"を検索しましたか? –

+0

通常、「未解決のシンボルエラー」は、オブジェクト、ライブラリ、またはdllファイルをリンクしていないことを意味します。 –

+0

[定義されていない参照/未解決の外部シンボルエラーとは何ですか?それを修正するにはどうすればいいですか?](http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external-シンボルエラーとハウツー・アイ・フィックス) –

答えて

0

おそらく、あなたのEXEにライブラリからのヘッダーファイルを含めると思います。

あなたはC++/CLIでライブラリを書くとき、それは、エクスポートするクラスの.NETメカニズムを使用しています。クラスを宣言するためのヘッダーファイルは必要ありません。.Netメタデータがそれを処理します。

ちょうどあなたのEXEは、ライブラリは、.NET参照として追加し、ちょうど先に行くと、ライブラリクラスを使用していることを確認してください。

0

この特定のエラーの正確な原因はわかりませんが、全体的に私は/ MTdランタイムライブラリを使用している元のアプリケーションと、 MD

関連する問題