Cross C compilé C Windows libcurl n’est pas lié correctement sur Ubuntu

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.