#1 Le 18/05/2012, à 10:25
- Zakhar
[Résolu] Librairie manquante compilation avec curl 12.04
Bonjour,
j'ai un problème pour linker les programmes d'exemple de curl (et les autres utilisant curl) depuis Pangolin (12.04)
Par exemple, le programme cookie_interface.c
ci dessous:
/*****************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
* / __| | | | |_) | |
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
* This example shows usage of simple cookie interface.
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <time.h>
#include <curl/curl.h>
static void
print_cookies(CURL *curl)
{
CURLcode res;
struct curl_slist *cookies;
struct curl_slist *nc;
int i;
printf("Cookies, curl knows:\n");
res = curl_easy_getinfo(curl, CURLINFO_COOKIELIST, &cookies);
if (res != CURLE_OK) {
fprintf(stderr, "Curl curl_easy_getinfo failed: %s\n", curl_easy_strerror(res));
exit(1);
}
nc = cookies, i = 1;
while (nc) {
printf("[%d]: %s\n", i, nc->data);
nc = nc->next;
i++;
}
if (i == 1) {
printf("(none)\n");
}
curl_slist_free_all(cookies);
}
int
main(void)
{
CURL *curl;
CURLcode res;
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
if (curl) {
char nline[256];
curl_easy_setopt(curl, CURLOPT_URL, "http://www.google.com/"); /* google.com sets "PREF" cookie */
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, ""); /* just to start the cookie engine */
res = curl_easy_perform(curl);
if (res != CURLE_OK) {
fprintf(stderr, "Curl perform failed: %s\n", curl_easy_strerror(res));
return 1;
}
print_cookies(curl);
printf("Erasing curl's knowledge of cookies!\n");
curl_easy_setopt(curl, CURLOPT_COOKIELIST, "ALL");
print_cookies(curl);
printf("-----------------------------------------------\n"
"Setting a cookie \"PREF\" via cookie interface:\n");
#ifdef WIN32
#define snprintf _snprintf
#endif
/* Netscape format cookie */
snprintf(nline, sizeof(nline), "%s\t%s\t%s\t%s\t%lu\t%s\t%s",
".google.com", "TRUE", "/", "FALSE", time(NULL) + 31337, "PREF", "hello google, i like you very much!");
res = curl_easy_setopt(curl, CURLOPT_COOKIELIST, nline);
if (res != CURLE_OK) {
fprintf(stderr, "Curl curl_easy_setopt failed: %s\n", curl_easy_strerror(res));
return 1;
}
/* HTTP-header style cookie */
snprintf(nline, sizeof(nline),
"Set-Cookie: OLD_PREF=3d141414bf4209321; "
"expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com");
res = curl_easy_setopt(curl, CURLOPT_COOKIELIST, nline);
if (res != CURLE_OK) {
fprintf(stderr, "Curl curl_easy_setopt failed: %s\n", curl_easy_strerror(res));
return 1;
}
print_cookies(curl);
res = curl_easy_perform(curl);
if (res != CURLE_OK) {
fprintf(stderr, "Curl perform failed: %s\n", curl_easy_strerror(res));
return 1;
}
}
else {
fprintf(stderr, "Curl init failed!\n");
return 1;
}
curl_global_cleanup();
return 0;
}
Normalement on compile/link ça en une seule ligne, et ça fonctionnait en 10.04, de la sorte :
`curl-config --cc --cflags --libs` -o cookie_interface cookie_interface.c
Je précise que j'ai bien sûr installé les libcurl avec :
sudo apt-get install libcurl4-gnutls-dev
Et là, depuis la 12.04 j'obtiens:
$ `curl-config --cc --cflags --libs` -o cookie_interface cookie_interface.c
/tmp/ccyjd6nn.o: In function `print_cookies':
cookie_interface.c:(.text+0xc3): undefined reference to `curl_easy_getinfo'
cookie_interface.c:(.text+0xd6): undefined reference to `curl_easy_strerror'
cookie_interface.c:(.text+0x161): undefined reference to `curl_slist_free_all'
/tmp/ccyjd6nn.o: In function `main':
cookie_interface.c:(.text+0x187): undefined reference to `curl_global_init'
cookie_interface.c:(.text+0x18c): undefined reference to `curl_easy_init'
cookie_interface.c:(.text+0x1cc): undefined reference to `curl_easy_setopt'
cookie_interface.c:(.text+0x1f7): undefined reference to `curl_easy_setopt'
cookie_interface.c:(.text+0x222): undefined reference to `curl_easy_setopt'
cookie_interface.c:(.text+0x231): undefined reference to `curl_easy_perform'
cookie_interface.c:(.text+0x24d): undefined reference to `curl_easy_strerror'
cookie_interface.c:(.text+0x2ba): undefined reference to `curl_easy_setopt'
cookie_interface.c:(.text+0x35f): undefined reference to `curl_easy_setopt'
cookie_interface.c:(.text+0x37b): undefined reference to `curl_easy_strerror'
cookie_interface.c:(.text+0x3ef): undefined reference to `curl_easy_setopt'
cookie_interface.c:(.text+0x40b): undefined reference to `curl_easy_strerror'
cookie_interface.c:(.text+0x452): undefined reference to `curl_easy_perform'
cookie_interface.c:(.text+0x46e): undefined reference to `curl_easy_strerror'
cookie_interface.c:(.text+0x4c4): undefined reference to `curl_global_cleanup'
collect2: ld a retourné 1 code d'état d'exécution
Donc visiblement, la compilation se passe bien, mais il ne trouve AUCUN des symboles propres à la librairie curl.
Je soupçonne un problème lié à la nouvelle organisation multiarch, mais ça vient peut-être d'un autre truc que j'aurais oublié.
Une idée ?
Dernière modification par Zakhar (Le 19/05/2012, à 18:29)
"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)
Hors ligne
#2 Le 19/05/2012, à 18:28
- Zakhar
Re : [Résolu] Librairie manquante compilation avec curl 12.04
Résolu (launchpad)
En fait il faut faire
`curl-config --cc --cflags` -o cookie_interface cookie_interface.c `curl-config --libs`
En effet, à cause d'un nouveau flag par défaut (--as-needed) les librairies partagées doivent être citées après l'objet que l'on cherche à linker.
J'ai donc transformé mon post sur le launchpad en "bug de documentation" car la ligne de commande ci dessus (post #1) était bien celle indiquée dans curl-config.html (installé par le paquer libcurl4-gnultls-dev).
Dernière modification par Zakhar (Le 19/05/2012, à 18:29)
"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)
Hors ligne