**How to make a dll using libcurl. can you share me a sample code.**
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <curl/curl.h>
using namespace std; string data; typedef
#ifdef BUILDING_TESTCURL_DLL
#define TESTCURL_DLL __declspec(dllexport)
#else
#define TESTCURL_DLL __declspec(dllimport)
#endif
curl_global_init(CURL_GLOBAL_ALL); //pretty obvious
curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, lpURL);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &writeCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
curl_easy_perform(curl);
if (data == "1")
{
//printf("Successfull");
strcpy(Result, "1");
}
v5 = 1;
curl_easy_cleanup(curl);
curl_global_cleanup();
size_t TESTCURL_DLL writeCallback(char* buf, size_t size, size_t
nmemb, void* up) {
for (int c = 0; c<size*nmemb; c++) { data.push_back(buf[c]);
//printf("", buf[c]); } return size*nmemb; //tell curl how many
bytes we handled }
I run this code with MinGW: g++ -shared -o testcurl.dll testcurl.o -Wl,--out-implib,libcurldll.a
it shows error: undefined reference to '_imp_curl_easy_setopt' undefined reference to '_imp_curl_easy_perform' undefined reference to '_imp_curl_easy_init'
Please help me for developing a dll file using curl.
Related
Please help me to fill up a vectors or arrays from CURL request via Json responce.
I have a responce from a OSRM website (u can see it below)/ That is a JSON format, but i can not parse it and use in my code later. I do not understand how to do it.
Can anyone help me?
{"tracepoints":
[
{"location":[73.103166,49.817488],"name":"some street1","hint":"10UDgP___k=","matchings_index":0,"waypoint_index":0,"alternatives_count":0},
{"location":[73.104389,49.817199],"name":"some street2","hint":"xUUDgP___k=","matchings_index":0,"waypoint_index":1,"alternatives_count":0},
{"location":[73.108378,49.815211],"name":"some street3","hint":"-EUDgP___k=","matchings_index":0,"waypoint_index":2,"alternatives_count":0}
], "matchings":
[ {
"distance":480.5,"duration":31.6,"weight":31.6,"weight_name":"routability","geometry":"i~`oHy}d}Lx#sF|A_K|#gFpFuD","confidence":0.579856,"legs":
[{"distance":93.5,"duration":6.2,"weight":6.2,"summary":"","steps":[]},{"distance":387,"duration":25.4,"weight":25.4,"summary":"","steps":[]}]
}
],
"code":"Ok"}
I downloaded a https://github.com/nlohmann/json but i am not able to use it.
Please gimme something to solve a problem.
My VS2015 code below
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "wldap32.lib")
#pragma comment(lib, "Normaliz.lib")
#pragma comment(lib, "crypt32.lib")
#define CURL_STATICLIB
#ifdef _DEBUG
# pragma comment (lib, "curl/libcurl_a_Debug.lib")
# pragma comment (lib, "curl/libssl_Debug.lib")
# pragma comment (lib, "curl/libcrypto_Debug.lib")
#else
# pragma comment (lib, "curl/libcurl_a_Release.lib")
#endif // DEBUG _DEBUG
#include "curl\curl.h"
#include "stdafx.h"
#include "iostream"
#include "string"
#include <iomanip>
#include "nlohmann/json.hpp"
using json = nlohmann::json;
static int writer(char *data, size_t size, size_t nmemb, std::string *writerData)
{
if (writerData == NULL)
return 0;
writerData->append(data, size*nmemb);
return size * nmemb;
}
int main()
{
json JStruct ;
std::string content;
//std::cout << "Some_Text";
std::vector<double> myLatpoints;
std::vector<double> myLonpoints;
curl_global_init(CURL_GLOBAL_ALL);
CURL *curl = nullptr;
curl = curl_easy_init();
curl_global_cleanup();
if (curl)
{
curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1:5000/match/v1/driving/73.103130,49.817423;73.104353,49.817137;73.10824,49.81517");
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &content);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
CURLcode code = curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
//curl_global_cleanup();
JStruct = content;
// HELP ME TO FILL UP MY VECTORS HERE PLEASE
std::cin.get() ;
return 0;
}
first I woud like to say that I saw similar post , and I posted this one on it but was removed... so all is in the title. I understood that it could be a problem at the linker step but I don't know why. Indeed, I linked all the (*.a) files on my Code::Blocks projet and added the different paths of the curl library in Linker options and search directories.
I also tried to manually compil and link but I did not succeed.
g++ -L ..\lib\curl\lib64 -I ..\lib\curl\include -lcurl main.cpp
Another attempt
g++ main.cpp -L ..\lib\curl\lib64 -I ..\lib\curl\include -lcurl -o test.exe
This is the error : " undefined reference to 'curl_easy_init' "
This is my code , maybe the source of troubles is here but I don't think so (tried the static lib too )
#include <iostream>
#define CURL_STATICLIB
#include <curl/curl.h>
#include <curl/easy.h>
#include <string>
#include <fstream>
#include <unistd.h>
#include <windows.h>
#include <Lmcons.h>
using namespace std;
size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) {
size_t written = fwrite(ptr, size, nmemb, stream);
return written;}
int main(void)
{
/*ofstream myfile;
myfile.open ("example.txt");
myfile << "Writing this to a file.\n";
myfile.close();*/
CURL *curl;
FILE *fp;
CURLcode res;
char *url = "http://stackoverflow.com";
char outfilename[FILENAME_MAX] = "page.html";
curl = curl_easy_init();
if (curl) {
fp = fopen(outfilename,"wb");
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
res = curl_easy_perform(curl);
/* always cleanup */
curl_easy_cleanup(curl);
fclose(fp);
}
return 0;
}
I am using libcurl to download serialized code and bust it open but, I get an error that looks like fstream is missing but it is very much included. I looked around but very little on the error.
Below is the error and code.
What did miss?
compile error output
g++ -g testGetprice2.cpp -o testGetprice2.o -std=gnu++11 -lcurl
testGetprice2.cpp: In function 'int getData()':
testGetprice2.cpp:45:56: error: 'ios_base' has not been declared
testGetprice2.cpp:45:72: error: 'ios_base' has not been declared
code:
#include "rapidjson/include/rapidjson/document.h"
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <curl/curl.h>
#include <unistd.h>
#include <unordered_map>
#include <string>
using namespace rapidjson;
struct myData
{
std::fstream *file;
std::string *str;
};
size_t write_data(void *ptr, size_t size, size_t nmemb, myData *data)
{
size_t numBytes = size * nmemb;
if (data->file)
data->file->write((char*)ptr, numBytes);
if (data->str)
*data->str += std::string((char*)ptr, numBytes);
return numBytes;
}
//function to get coin data and perform analysis
int getData()
{
int count = 0;
//begin non terminating loop
while(true)
{
count++;
CURL *curl = curl_easy_init();
if (curl)
{
curl_easy_setopt(curl, CURLOPT_URL, "http://pubapi.cryptsy.com/api.php?method=singlemarketdata&marketid=155");
std::fstream file("/home/coinz/cryptsy/myfile.txt", ios_base::out | ios_base::ate);
std::string json;
myData data;
data.file = &file;
data.str = &json;
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &write_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &data);
/* Perform the request, res will get the return code */
CURLcode res = curl_easy_perform(curl);
/* Check for errors */
if (res != CURLE_OK)
{
std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl;
}
else
{
file << std::endl;
//begin deserialization
Document document;
document.Parse(json.c_str());
assert(document.HasMember("lasttradeprice"));
assert(document["hello"].IsString());
std::cout << "The Last Traded Price is = " << document["lasttradeprice"].GetString() << std::endl;
}
/* always cleanup */
curl_easy_cleanup(curl);
}
//timer for URL request. *ADUJST ME AS DESIRED*
usleep(10000000);
}
return 0;
}
//Le Main
int main(void)
{
getData();
}
ios_base is in namespace std. Add prefix std:: before ios_base.
I have data in a JSON object that I can't seem to get to.
Error:
> testGetprice3.o: testGetprice3.cpp:71: int getData(): Assertion
> `document["success"].IsString()' failed.
I have tried switching the datatypes, it only errors.
How do I correctly access my JSON object data?
#include "rapidjson/include/rapidjson/document.h"
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <curl/curl.h>
#include <unistd.h>
#include <unordered_map>
#include <string>
using namespace rapidjson;
struct myData
{
std::fstream *file;
std::string *str;
};
size_t write_data(void *ptr, size_t size, size_t nmemb, myData *data)
{
size_t numBytes = size * nmemb;
if (data->file)
data->file->write((char*)ptr, numBytes);
if (data->str)
*data->str += std::string((char*)ptr, numBytes);
return numBytes;
}
//function to get coin data and perform analysis
int getData()
{
int count = 0;
//begin non terminating loop
while(true)
{
count++;
CURL *curl = curl_easy_init();
if (curl)
{
curl_easy_setopt(curl, CURLOPT_URL, "http://pubapi.cryptsy.com/api.php?method=singlemarketdata&marketid=155");
std::fstream file("/home/coinz/cryptsy/myfile.txt", std::ios_base::out | std::ios_base::ate);
std::string json;
myData data;
data.file = &file;
data.str = &json;
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &write_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &data);
/* Perform the request, res will get the return code */
CURLcode res = curl_easy_perform(curl);
/* Check for errors */
if (res != CURLE_OK)
{
std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl;
}
else
{
file << std::endl;
//begin deserialization
Document document;
document.Parse(json.c_str());
assert(document.HasMember("success"));
assert(document["success"].IsString());
//std::cout << "The Last Traded Price is = " << document["lasttradeprice"].GetString() << std::endl;
}
/* always cleanup */
curl_easy_cleanup(curl);
}
//timer for URL request. *ADUJST ME AS DESIRED*
usleep(10000000);
}
return 0;
}
//Le Main
int main(void)
{
getData();
}
Looking at your JSON data, the success member is an int (as it is not surrounded by quote marks).
More info on JSON types can be found here: http://en.wikipedia.org/wiki/JSON#Data_types.2C_syntax_and_example
If the success member was a string, the JSON data would look like this: {"success":"1",...
Therefore when you call assert(document["success"].IsString()) it causes the error, as the success member is not a string, but an int.
Since the success member is an int, change the assertion to test whether it's an int - assert(document["success"].IsInt())
You stated you changed datatypes, but did not state which ones you tried. From the URL you are using, success is being returned as "success":1, which is an int.
Change:
assert(document["success"].IsString());
to:
assert(document["success"].IsInt());
The code below is a test for the CURL C API . The problem is that the callback function write_callback is never called. Why ?
/** compilation: g++ source.cpp -lcurl */
#include <assert.h>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cassert>
#include <curl/curl.h>
using namespace std;
static size_t write_callback(void *ptr, size_t size, size_t nmemb, void *userp)
{
std::cerr << "CALLBACK WAS CALLED" << endl;
exit(-1);
return size*nmemb;
}
static void test_curl()
{
int any_data=1;
CURLM* multi_handle=NULL;
CURL* handle_curl = ::curl_easy_init();
assert(handle_curl!=NULL);
::curl_easy_setopt(handle_curl, CURLOPT_URL, "http://en.wikipedia.org/wiki/Main_Page");
::curl_easy_setopt(handle_curl, CURLOPT_WRITEDATA, &any_data);
::curl_easy_setopt(handle_curl, CURLOPT_VERBOSE, 1);
::curl_easy_setopt(handle_curl, CURLOPT_WRITEFUNCTION, write_callback);
::curl_easy_setopt(handle_curl, CURLOPT_USERAGENT, "libcurl-agent/1.0");
multi_handle = ::curl_multi_init();
assert(multi_handle!=NULL);
::curl_multi_add_handle(multi_handle, handle_curl);
int still_running=0;
/* lets start the fetch */
while(::curl_multi_perform(multi_handle, &still_running) ==
CURLM_CALL_MULTI_PERFORM );
std::cerr << "End of curl_multi_perform."<< endl;
//cleanup should go here
::exit(EXIT_SUCCESS);
}
int main(int argc,char** argv)
{
test_curl();
return 0;
}
Many thanks
Pierre
You need to check the value of still_running and call curl_multi_perform() again if there are still pending operations.
Simple example:
int still_running=0;
/* lets start the fetch */
do {
while(::curl_multi_perform(multi_handle, &still_running) ==
CURLM_CALL_MULTI_PERFORM);
} while (still_running);