Je suis actuellement en train d’essayer de comstackr libcurl en c pour Windows 32x sur Ubuntu 64x 14.04. Après quelques recherches, j’ai suivi ces étapes:
1) Télécharger la bibliothèque depuis https://curl.haxx.se/download.html
2) Allez dans le dossier libcurl extrait et exécutez:
./configure --host=i686-w64-mingw32 --build=i686-pc-linux-gnu --prefix=/usr/i686-w64-mingw32/ --enable-static --disable-shared
3) Exécuter: make
4) Exécuter: sudo make install
Ensuite, j’ai ajouté ces déclarations d’inclusion:
#include // Needed for curl #include // Windows API #include int main(int argc, char** argv) { CURL *curl; CURLcode response; char url[] = "someurl.com"; curl = curl_easy_init(); if(curl) { curl_easy_setopt(curl, CURLOPT_URL, url); //set url options /* Perform the request, res will get the return code */ response = curl_easy_perform(curl); if(response != CURLE_OK) { //Do something } /* always cleanup */ curl_easy_cleanup(curl); } return 0; }
Maintenant, j’ai essayé de comstackr mon code avec les arguments suivants:
i686-w64-mingw32-gcc main.c -o main.exe -L/usr/i686-w64-mingw32/lib -lcurl
Le compilateur a renvoyé le code d’erreur suivant:
/tmp/ccebLf6U.o:main.c:(.text+0x336): Not defined reference to `_imp__curl_easy_init' /tmp/ccebLf6U.o:main.c:(.text+0x365): Not defined reference to `_imp__curl_easy_setopt' /tmp/ccebLf6U.o:main.c:(.text+0x372): Not defined reference to `_imp__curl_easy_perform' /tmp/ccebLf6U.o:main.c:(.text+0x3f4): Not defined reference to `_imp__curl_easy_cleanup' collect2: error: ld returned 1 exit status
Quelqu’un a-t-il une idée sur la façon de résoudre ce problème?
[MODIFIER]
Ce qui est vraiment intéressant, c’est que si vous appelez curl-config, vous obtenez un tas d’options de compilation.
Bibliothèque de --prefix
croisée À l’aide de --prefix
vous définissez le répertoire d’installation du niveau supérieur.
Les bibliothèques seront placées dans /usr/i686-w64-mingw32/lib
Même chose pour les fichiers inclus, ils seront placés /usr/i686-w64-mingw32/include
Utiliser -L/usr/i686-w64-mingw32/
vous pointez le mauvais chemin pour les bibliothèques et cross-comstackr ne peut pas trouver libcurl
Pour indiquer l’emplacement correct de l’inclusion, vous devez append -I/usr/i686-w64-mingw32/include
à votre commande.
A la fin, vous avez compilé des bibliothèques statiques seulement alors vous voulez les comstackr statiquement: ajoutez -static
à votre commande.
Donc la commande correcte sera:
i686-w64-mingw32-gcc -static -I/usr/i686-w64-mingw32/include -L/usr/i686-w64-mingw32/lib -lcurl main.c -o main.exe
De la FAQ des boucles :
Si vous obtenez une erreur de l’éditeur de liens telle que “symbole inconnu __imp__curl_easy_init …”, vous vous êtes lié à la mauvaise bibliothèque (statique). Si vous souhaitez utiliser libcurl.dll et import lib, vous n’avez pas besoin de CFLAGS supplémentaire, mais utilisez l’une des bibliothèques d’importation ci-dessous. Voici les bibliothèques produites par les différents fichiers lib / Makefile. *:
Target: static lib. import lib for libcurl*.dll. ----------------------------------------------------------- MingW: libcurl.a libcurldll.a MSVC (release): libcurl.lib libcurl_imp.lib MSVC (debug): libcurld.lib libcurld_imp.lib Borland: libcurl.lib libcurl_imp.lib
Essayez le chemin de l’éditeur de liens -lcurl_imp
ou -llibcurl_imp
Mise à jour : Voici les indicateurs sur mon Ubuntu avec MinGW64:
i686-w64-mingw32-g++ -o app.exe objects.a -Lexternals/curl-7.39.0/lib -llibcurl_imp
Pourquoi j’utilise libcurl_imp.lib
place de libcurldll.a
comme décrit dans le tableau ci-dessus? Becouse je construis curl avec cmake qui fait libcurl_imp.lib
. Donc, vous devriez vérifier le nom de la bibliothèque construite.
Donc, ma solution à ce problème réside probablement ici: des astuces de compilation croisées pour les bibliothèques
Voici quelques conseils et astuces pour le compilateur de compilation croisée mingw32 et la compilation de curl avec mon argument manquant -DCURL_STATICLIB. Je n’ai pas testé cela parce que j’ai résolu le problème sans boucler.