Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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