PDA

Visualizza la versione completa : [C++] Windows e curl


fermat
15-01-2013, 12:40
ciao!
ho installato cygwin su windows 7 e tra i pacchetti ho installato anche curl.
ho creato questa funzione:


void Read::readUltimeEntrate() {
curl_slist_append(headers, "Accept: application/json");
curl_slist_append(headers, "Content-Type: application/json");
curl_slist_append(headers, "charsets: utf-8");
curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/file.php");
curl_easy_setopt(curl, CURLOPT_HTTPGET, 1);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
res = curl_easy_perform(curl);
if (CURLE_OK == res) {
char *ct;
res = curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &ct);
if ((CURLE_OK == res) && ct) {
res = curl_easy_perform(curl);
cout << res << endl;
}
}
}
curl_easy_cleanup(curl);
}

nel file h ho incluso la libreria <curl/curl.h>.
quando vado ad eseguire il programma mi escono tutti questi errori:


build/Debug/Cygwin-Windows/read.o: In function `_ZN4Read17readUltimeEntrateEv':
/cygdrive/c/Users/admferrone/Desktop/Banca/read.cpp:14: undefined reference to `_curl_slist_append'
/cygdrive/c/Users/admferrone/Desktop/Banca/read.cpp:15: undefined reference to `_curl_slist_append'
/cygdrive/c/Users/admferrone/Desktop/Banca/read.cpp:16: undefined reference to `_curl_slist_append'
/cygdrive/c/Users/admferrone/Desktop/Banca/read.cpp:17: undefined reference to `_curl_easy_init'
/cygdrive/c/Users/admferrone/Desktop/Banca/read.cpp:19: undefined reference to `_curl_easy_setopt'
/cygdrive/c/Users/admferrone/Desktop/Banca/read.cpp:20: undefined reference to `_curl_easy_setopt'
/cygdrive/c/Users/admferrone/Desktop/Banca/read.cpp:21: undefined reference to `_curl_easy_setopt'
/cygdrive/c/Users/admferrone/Desktop/Banca/read.cpp:22: undefined reference to `_curl_easy_setopt'
/cygdrive/c/Users/admferrone/Desktop/Banca/read.cpp:24: undefined reference to `_curl_easy_perform'
/cygdrive/c/Users/admferrone/Desktop/Banca/read.cpp:28: undefined reference to `_curl_easy_getinfo'
/cygdrive/c/Users/admferrone/Desktop/Banca/read.cpp:30: undefined reference to `_curl_easy_perform'
/cygdrive/c/Users/admferrone/Desktop/Banca/read.cpp:35: undefined reference to `_curl_easy_cleanup'
collect2: ld returned 1 exit status
make[2]: *** [dist/Debug/Cygwin-Windows/banca.exe] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2

da cosa pu dipendere??

c0der
15-01-2013, 12:45
un semplice problema di linking. Non hai specificato -lcurl nel Makefile o in generale nel tuo sistema di compilazione, che non so quale sia.

fermat
15-01-2013, 12:57
uso gcc.
questo il comando che do:


g++.exe -lcurl -o dist/Debug/Cygwin-Windows/banca build/Debug/Cygwin-Windows/main.o build/Debug/Cygwin-Windows/read.o

c0der
15-01-2013, 13:08
un po' che non uso cygwin, per facilitare le cose esiste per caso la directory /usr/lib/pkgconfig/ e se s cosa c' dentro?

fermat
15-01-2013, 13:22
non i in /usr, ma direttamente in /lib.
dentro ci sono vari file con estensione .pc, tra i quali c' anche libcurl.pc.

c0der
15-01-2013, 13:28
Ok allora dovresti avere anche un programma che si chiama pkg-config che comodissimo.

Dovresti poter eseguire questi comandi, prova a vedere l'output:
$ pkg-config curl --cflags
e
$ pkg-config curl --libs

Entrambi si usano sulla commandline tra apici rovesciati.

Nel tuo caso di linking, ora ti serve:
$ g++.exe -o dist/Debug/Cygwin-Windows/banca build/Debug/Cygwin-Windows/main.o build/Debug/Cygwin-Windows/read.o `pkg-config curl --libs`

Invece il cflags lo avresti potuto usare in fase di compilazione:
$ g++.exe -c main.c -o build/Debug/Cygwin-Windows/main.o `pkg-config curl --cflags`

EDIT
Ho scritto pkg-config ma sar pkg-config.exe.

fermat
15-01-2013, 14:00
uhm c' qualcosa che nn va ancora.
pkg-config l'ho dovuto installare perch nn c'era.
ho avviato il terminale cygwin:


$ pkg-config curl --cflags
Package curl was not found in the pkg-config search path.
Perhaps you should add the directory containing `curl.pc'
to the PKG_CONFIG_PATH environment variable
No package 'curl' found

sto guardando un p in giro ma nn ho trovato molte soluzioni fino adesso.

fermat
15-01-2013, 14:12
ho cambiato cos:


g++.exe `pkg-config libcurl --cflags` `pkg-config libcurl --libs` -o dist/Debug/Cygwin-Windows/banca build/Debug/Cygwin-Windows/main.o build/Debug/Cygwin-Windows/read.o

pare che libcurl venga riconosciuto.
per mi ritorna l'errore di prima!!

c0der
15-01-2013, 14:50
Mi riporti cosa ti stampa
$ pkg-config libcurl --libs
cos vediamo le path complete delle tue librerie?

fermat
15-01-2013, 14:54
ok, ecco qua:


$ pkg-config libcurl --libs
-lcurl -lidn -liconv -llber -lldap -lgssapi -lheimntlm -lkrb5 -lhx509 -lcom_err -lasn1 -lwind -lheimbase -lroken -lcrypt -lssh2 -lssl -lcrypto -lz

a quanto vedo -lcurl c'.

Loading