2016-05-20 14 views
7

Attualmente sto provando a compilare libcurl in c per Windows 32x su Ubuntu 64x 14.04. Dopo un po 'di ricerca ho seguito questi passi:CrossCiled C Windows libcurl non viene collegato correttamente su Ubuntu

1) Scarica libreria dal https://curl.haxx.se/download.html

2) Andate nella cartella libcurl estratta ed eseguire:

./configure --host=i686-w64-mingw32 --build=i686-pc-linux-gnu --prefix=/usr/i686-w64-mingw32/ --enable-static --disable-shared

3) Eseguire: fare

4) Eseguire: sudo make install

Poi ho aggiunto questi includono SCHEDA nti:

#include <winsock2.h> // Needed for curl 
#include <windows.h> // Windows API 
#include <curl/curl.h> 

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; 
} 

Ora ho provato a compilare il mio codice con i seguenti argomenti:

i686-w64-mingw32-gcc main.c -o main.exe -L/usr/i686-w64-mingw32/lib -lcurl 

Il compilatore restituito seguente codice di errore:

/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 

Qualcuno ha un'idea su come risolvere il problema ?

[EDIT]

qualcosa di veramente interessante mi sono imbattuto su è che se si chiama curl-config si ottiene un sacco di opzioni del compilatore.

+0

Perché hai taggato [tag: linux] e [tag: ubuntu] se includi 'windows.h'? ... – LPs

+0

@LPs Leggi cosa ho dichiarato nella mia prima frase. Ho fatto un crosscompile su Ubuntu, ovvero Linux, e il mio problema sta nel percorso crosscompile di Linux. – Qubasa

risposta

0

Quindi la mia soluzione a questo problema sta probabilmente proprio qui: Cross compile tips for libraries

Questi sono alcuni suggerimenti e trucchi per la croce mingw32 compilation compilatore e la compilazione di riccio con la mia mancanza -DCURL_STATICLIB argomento. Non ho provato questo perché ho risolto il problema senza curvatura.

+0

Ma questo di solito è solo il primo passo. In questo modo si eseguirà molto probabilmente in altri problemi di collegamento come: libcurld.lib (easy.obj): errore LNK2019: simbolo esterno non risolto __imp__WSACleanup @ 0 a cui si fa riferimento nella funzione _win32_init .... è possibile risolverli collegando di nuovo : wldap32.lib e Ws2_32.lib http://blog.yastrebkov.com/2010/08/unresolved-externals-while-linking.html – GregPhil

2

Libreria di compilazione incrociata Utilizzando --prefix si sta definendo la directory di installazione di livello superiore.

Libs verrà inserito nel /usr/i686-w64-mingw32/lib

Stessa cosa per include i file saranno collocati /usr/i686-w64-mingw32/include

Utilizzando -L/usr/i686-w64-mingw32/ si punta la strada sbagliata per le biblioteche e cross-compilatore non riesce a trovare libcurl

Per puntare alla posizione di inclusione corretta è necessario aggiungere -I/usr/i686-w64-mingw32/include al comando.

Alla fine hai compilato le librerie curl statiche solo dopo che le vuoi compilare staticamente: aggiungi -static al tuo comando.

SO il comando corretto sarà:

i686-w64-mingw32-gcc -static -I/usr/i686-w64-mingw32/include -L/usr/i686-w64-mingw32/lib -lcurl main.c -o main.exe 
+0

Provato ma purtroppo non funziona :(Avete qualche altra idea? – Qubasa

+0

Dove sono libcurl. * Installato? '/ Usr/i686-w64-mingw32/lib' il percorso corretto? – LPs

+0

Sì, è lì è un libcurl.a e un libcurl.la – Qubasa

1

Dal curls FAQ:

Se si ottiene errore di linker come "simbolo sconosciuto __imp__curl_easy_init ..." aver collegato contro il male (libreria statica). Se si si desidera utilizzare libcurl.dll e lib di importazione, non è necessario alcun CFaggiuntivo, ma utilizzare una delle librerie di importazione di seguito. Queste sono le librerie prodotte dai vari lib/Makefile.* files: Il percorso

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 

Cercare di linker -lcurl_imp o -llibcurl_imp

Aggiornamento: Ecco scrivere bandiere sulla mia Ubuntu con MinGW64:

i686-w64-mingw32-g++ -o app.exe objects.a -Lexternals/curl-7.39.0/lib -llibcurl_imp 

perché io uso libcurl_imp.lib invece libcurldll.a come descritto nella tabella sopra? Devo costruire arricciatura con cmake che rendono libcurl_imp.lib. Quindi dovresti controllare il nome della libreria costruita.

+0

Provato con successo. Ho provato di nuovo con la libreria di ricompilazione ... fallito .... No, mi fermerò proprio qui.- Sto pensando che alla fine ho fatto qualcosa di sbagliato con la configurazione o la compilazione? Tra l'altro sto usando la versione 7.49 della libreria. Qualcosa di veramente interessante in cui sono incappato è che se chiami curl-config ottieni un sacco di opzioni del compilatore che sono interessanti ma non aiutano nel mio caso. – Qubasa

Problemi correlati