2016-06-28 4 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 (문자열들) 등으로 인스턴스화 기능을 가지고, 그래서 그게 문제라고 생각하지 않습니다. 또한 대부분의 링크 here을 살펴보고 내 라이브러리가 모두 순환 라이브러리 종속성, 라이브러리 순서 등이 있는지 확인하기 위해 많은 검색을 수행했습니다. 전체 솔루션의 3 개 프로젝트 중 2 개는 "공통 언어 없음 런타임 지원 "하지만 내 클라이언트 라이브러리는"공용 언어 런타임 지원 "을 사용합니다. 이것은 라이브러리 간의 한 가지 차이점입니다.

누구나 이러한 오류가 발생하는 이유에 대한 의견이 있습니까?

전체 클라이언트 라이브러리 :

#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- symbol-error-and-do-do-i-fix) –

답변

0

아마도 EXE 파일에 라이브러리의 헤더 파일이 포함되어 있다고 생각합니다.

C++/CLI에서 라이브러리를 작성할 때 내 보낸 클래스에 .Net 메커니즘을 사용합니다. 클래스를 선언 할 때 헤더 파일이 필요 없으며 .Net 메타 데이터가이를 처리합니다.

EXE에 .Net 참조로 추가 된 라이브러리가 있는지 확인하고 바로 라이브러리 클래스를 사용하십시오.

0

이 특정 오류의 정확한 원인은 무엇인지 모르겠지만 전반적으로/MTd 런타임 라이브러리를 사용하는 원래 응용 프로그램과/라이브러리를 사용하는 원래 라이브러리로 인해 많은 문제가 있음을 알았습니다. MD