-1

I've been searching around and have come to a stop with this thing.

I basically get these errors here:

1>Client.obj : error LNK2019: unresolved external symbol "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl HTTP_POST_REQUEST(char *,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?HTTP_POST_REQUEST@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@PADV12@1@Z) referenced in function "public: virtual void __thiscall Client::Send(void)" (?Send@Client@@UAEXXZ)
1>G:\Development\C++\Client\Debug\Client.exe : fatal error LNK1120: 1 unresolved externals

To my knowledge I think it's that Client.obj is not getting compiled with the program (don't quote me on this)? But I have read that it might be some linking problems or something like that. To me it seems that I've done everythign right (but clearly I haven't).

Client.cpp

#include <iostream>
#include <string>
using namespace std;

#include "HttpUtils.h"
#include "Client.h"

Client::Client() {
    cout << "Works!" << endl;
}

void Client::Send() {
    string res = HTTP_POST_REQUEST("localhost", "/test.php", "data1=data&data2=data");
    cout << res << endl;
}

Client.h

#pragma once

#include <string>
using namespace std;

#ifndef CLIENT__H
#define CLIENT__H

class Client {

public:
    Client();

    virtual void Send();
};
#endif

main.cpp

#include <iostream>
#include <string>
using namespace std;

#include "Client.h"

int main(int argc, char *argv[]) {
    Client mainClient;
    Client* client1 = &mainClient;

    client1->Send();
    cin.get();
}

Any and all help is great! Thanks!

EXTRA CODE

HttpUtils.cpp

#include <stdlib.h>
#include <winsock.h>
#include <sstream>
#pragma comment (lib, "wsock32.lib")

#include <iostream>
#include <string>
using namespace std;

#include "HttpUtils.h"

void die_with_error(char *errorMessage) {
    cerr << errorMessage << endl;
    cin.get();
    exit(1);
}

void die_with_wserror(char *errorMessage) {
    cerr << errorMessage << ": " << WSAGetLastError() << endl;
    cin.get();
    exit(1);
}

string HTTP_POST_REQUEST(char *hostname, string path, string data) {
    string request;
    string response;
    int resp_leng;

    char buffer[BUFFERSIZE];
    struct sockaddr_in serveraddr;
    int sock;

    WSADATA wsaData;
    hostent *remoteHost;
    int port = 80;

    stringstream ss;
    ss << data.length();

    stringstream request2;
    request2 << "POST " << path << " HTTP/1.1" << endl;
    request2 << "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)" << endl;
    request2 << "Host: " << hostname << endl;
    request2 << "Content-Length: " << data.length() << endl;
    request2 << "Content-Type: application/x-www-form-urlencoded" << endl;
    request2 << "Accept-Language: en-uk" << endl;
    request2 << endl;
    request2 << data;
    request = request2.str();

    cout << request << endl << "###################################################" << endl << endl;

    //  Init WinSock.
    if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0)
        die_with_wserror("WSAStartup() failed");

    //  Open socket.
    if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
        die_with_wserror("socket() failed");


    //  Convert hostname into IP
    remoteHost = gethostbyname(hostname);
    char *temp;
    if (remoteHost != NULL) {
        temp = remoteHost->h_addr_list[0];
    } else {
        temp = NULL;
        return "Error: Invalid hostname passed to HTTP_POST().";
    }


    //  Connect.
    memset(&serveraddr, 0, sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;

    int i = 0;
    if (remoteHost->h_addrtype == AF_INET)
    {
        while (remoteHost->h_addr_list[i] != 0) {
            serveraddr.sin_addr.s_addr = *(u_long *)remoteHost->h_addr_list[i++];
        }
    }

    serveraddr.sin_port = htons((unsigned short)port);
    if (connect(sock, (struct sockaddr *) &serveraddr, sizeof(serveraddr)) < 0)
        die_with_wserror("connect() failed");

    //  Send request.
    if (send(sock, request.c_str(), request.length(), 0) != request.length())
        die_with_wserror("send() sent a different number of bytes than expected");

    //  Get response.
    response = "";
    resp_leng = BUFFERSIZE;
    while (resp_leng == BUFFERSIZE)
    {
        resp_leng = recv(sock, (char*)&buffer, BUFFERSIZE, 0);
        if (resp_leng>0)
            response += string(buffer).substr(0, resp_leng);
        //note: download lag is not handled in this code
    }

    //  Disconnect
    closesocket(sock);

    //  Cleanup
    WSACleanup();

    //response.erase(0, 184);
    return  response;
}

HttpUtils.h

#pragma once

#include <iostream>
#include <string>
using namespace std;

#ifndef HTTP_UTILS__H
#define HTTP_UTILS__H
#define BUFFERSIZE 1024
void die_with_error(char *errorMessage);
void die_with_wserror(char *errorMessage);

string HTTP_POST_REQUEST(char *hostname, string path, string data);
#endif
20
  • 1
    Do you really have Client->Send(); in your main? Shouldn't it be client1->Send();? Commented Aug 29, 2016 at 16:14
  • That was just a typo when copying over the code, but the errors are still there. Commented Aug 29, 2016 at 16:17
  • Where is HTTP_POST_REQUEST() implemented? Is there some library that you forgot to link? Commented Aug 29, 2016 at 16:17
  • I think, you need to provide HttpUtils.h too. Commented Aug 29, 2016 at 16:18
  • 1
    Unresolved External Symbol error often comes when it finds the prototype of the function which you're calling, but can't find the implementation, so double check whether HttpUtils.cpp is included in your project or not. Commented Aug 29, 2016 at 16:39

1 Answer 1

2

make sure you add HttpUtils.cpp to your make file/command .. it sounds like HttpUtils.cpp is not compiled. That's why Client can't find HttpUtils symbols !

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.