2016-06-28 3 views
0

Я создал небольшую библиотеку CLR (MyClient) в VS2005 для интеграции потоков в существующее приложение на C++ (также написанное на VS2005). Когда я построить проект этих ошибок:ошибка 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++ и ООП, но делали это постоянно в течение последних нескольких недель. Это мой .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 только имеет функции инстанцированы, как символ * MyClient :: createMsg (строка с), и т.д., так что я не думаю, что это проблема. Я также просмотрел большинство ссылок here и много раз искал, чтобы убедиться, что у меня там все библиотеки, нет круговой зависимости от lib, порядка библиотек и т. Д. Из 3 проектов в моем решении 2 используйте «No Common Language» Runtime support ", но в моей клиентской библиотеке используется поддержка Common Language Runtime Support, это единственное различие между библиотеками.

Есть ли у кого-нибудь мысли о том, почему происходят эти ошибки?

Полная Клиентская библиотека:

#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(); 
} 

Edit: Эти ошибки не происходит, когда я создал фиктивную приложение, когда одни и те же параметры, что и приложения я пытаюсь интегрировать прямо сейчас, что почему я не уверен, что изменилось или как разрешить ошибки.

+0

Прежде чем кто-нибудь закроет этот дубликат, вы искали в Интернете «lnk2019»? –

+0

Обычно «неразрешенная символьная ошибка» означает, что вы не связываете объект, библиотеку или файл dll. –

+0

Возможный дубликат [Что такое неопределенная ссылка/неразрешенная ошибка внешнего символа и как ее исправить?] (Http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external- symbol-error-and-how-do-i-fix) –

ответ

0

Возможно, вы включили заголовочный файл из библиотеки вашего EXE.

Когда вы пишете библиотеку в C++/CLI, она использует механизмы. Net для экспортированных классов. Вам не нужен заголовочный файл для объявления класса, метаданные .Net позаботятся об этом.

Просто убедитесь, что ваш EXE имеет библиотеку, добавленную как ссылку .Net, и просто продолжайте использовать класс библиотеки.

0

Так что я не уверен, какова была конкретная причина этой конкретной ошибки, но в целом я узнал, что у меня возникло много проблем из-за исходного приложения, использующего библиотеку времени выполнения/MTd, и мою новую библиотеку с использованием/MD

Смежные вопросы