none
Ajouter une librairie et compiler du C avec VC RRS feed

  • Question

  • Bonjour,

    Je travaille sur une application en C et je dois appeler la librairie cUrl (https://github.com/curl/curl).

    J'ai compilé le projet en une libraire statique, j'ai mis les fichiers .h dans le répertoire contenu dans la variable environnement include et le fichier .lib dans le répertoire LIBPATH (selon la variable environnement aussi).

    Le projet n'est pas un de type visual studio, j'appelle seulement le compilateur VC de visual studio 2010.

    La compilation me retourne les erreurs suivantes :

    error LNK2019: symbole externe non résolu __imp_curl_easy_strerror
    error LNK2019: symbole externe non résolu __imp_curl_easy_perform
    error LNK2019: symbole externe non résolu __imp_curl_easy_setopt
    error LNK2019: symbole externe non résolu __imp_curl_easy_init

    Dans mes recherches, j'ai trouvé la page suivante qui ressemble vraiment à mon problème :

    https://bobobobo.wordpress.com/2008/11/08/working-with-curl-getting-started-the-easy-way-on-win32/

    Et dans cette page, on donne la solution à la page ci-dessous :

    https://curl.haxx.se/mail/lib-2007-04/0120.html

    La question que je me pose est comment appliquer la solution décrite parce que je ne suis pas à l'intérieur d'un projet visual studio.

    Merci à l'avance pour votre aide!

    vendredi 3 février 2017 20:40

Réponses

  • VC++ est un compilateur exclusivement C++, pas C.

    Il ne suit pas les spécifications C99 et plus récentes du C.

    @Castorix31, ta "solution" n'est qu'une manière de rendre le code encore plus dépendant de l'IDE et d'un compilateur particulier. C'est vraiment pas une bonne idée, surtout qu'il existe une méthode bien plus "portable", les options dans la ligne de compilation/propriétés dans l'IDE.

    De plus, le problème n'a rien à voir avec un problème de .lib manquante dans les options du linker.

    @Brainstorm85, le double "_" devant "imp" montre un double mangling, un mangling C et un mangling C++.

    Or, votre librairie/dll est en C, il ne doit avoir que le mangling C.

    Cela arrive très fréquemment quand on utilise des fichiers d'en-tête C non "C++-aware" (fichier d'en-tête qui ne gèrent pas le fait qu'ils puissent servir d'entré a un compilateur C++).

    Quand on inclut le fichier d'en-tête de librairie C, vous devez l'encadrer par les marqueurs C++ 'extern "C"{...}'. (Mettre les #include de fichier C à la place des ..., attention à mettre un  #include par ligne).


    Paul Bacelar, Ex - MVP VC++

    • Marqué comme réponse Brainstorm85 lundi 6 février 2017 14:45
    lundi 6 février 2017 13:49
    Modérateur

Toutes les réponses

  • On peut linker les libs avec

    #pragma comment

    Quelque chose comme ça :

    #if defined(DEBUG)||defined(_DEBUG)
    #pragma comment(lib, "libcurld.lib")
    #else
    #pragma comment(lib, "libcurl.lib")
    #endif

    vendredi 3 février 2017 21:17
  • VC++ est un compilateur exclusivement C++, pas C.

    Il ne suit pas les spécifications C99 et plus récentes du C.

    @Castorix31, ta "solution" n'est qu'une manière de rendre le code encore plus dépendant de l'IDE et d'un compilateur particulier. C'est vraiment pas une bonne idée, surtout qu'il existe une méthode bien plus "portable", les options dans la ligne de compilation/propriétés dans l'IDE.

    De plus, le problème n'a rien à voir avec un problème de .lib manquante dans les options du linker.

    @Brainstorm85, le double "_" devant "imp" montre un double mangling, un mangling C et un mangling C++.

    Or, votre librairie/dll est en C, il ne doit avoir que le mangling C.

    Cela arrive très fréquemment quand on utilise des fichiers d'en-tête C non "C++-aware" (fichier d'en-tête qui ne gèrent pas le fait qu'ils puissent servir d'entré a un compilateur C++).

    Quand on inclut le fichier d'en-tête de librairie C, vous devez l'encadrer par les marqueurs C++ 'extern "C"{...}'. (Mettre les #include de fichier C à la place des ..., attention à mettre un  #include par ligne).


    Paul Bacelar, Ex - MVP VC++

    • Marqué comme réponse Brainstorm85 lundi 6 février 2017 14:45
    lundi 6 février 2017 13:49
    Modérateur
  • Merci! Le problème est effectivement corrigé maintenant cela m'affiche d'autres erreurs :-P mais bon je progresse! Un gros merci et bonne journée!

    lundi 6 février 2017 14:47
  • VC++ est un compilateur exclusivement C++, pas C.


    N'importe quoi...

    Je compile du C  avec les directives de compil C depuis 20 ans au moins...

    lundi 6 février 2017 16:26
  • OK, @phil chelis, alors compile un code utilisant un VLA sous VC++.

    Le VLA fait partie de la norme C99 pourtant.

    Sinon, je t'encourage à contacter Herb Sutter directement pour le convaincre de faire de VC un vrai compilateur C99 (déjà qu'il a du mal à être C++14):

    https://visualstudio.uservoice.com/forums/121579-visual-studio-ide/suggestions/2089423-c99-support

    Il y a 20 ans, le C++ n'était même pas standardisé, faut sortir de sa grotte? ;-)


    Paul Bacelar, Ex - MVP VC++



    lundi 6 février 2017 17:16
    Modérateur