2016-05-20 7 views
7

Obecnie próbuję przekroczyć kompilację libcurl w c dla Windows 32x na Ubuntu 64x 14.04. Po trochę badań Śledziłem kroki:Cross compiled C Windows libcurl nie jest poprawnie połączony z Ubuntu

1) Pobierz bibliotekę z https://curl.haxx.se/download.html

2) przejdź do folderu wydobytego libcurl i realizują:

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

3) Wykonanie: należy

4) Wykonaj sudo aby zainstalować

Następnie dodaje te obejmują REGULACJI NTS:

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

Teraz próbowałem skompilować mój kod z następującymi argumentami:

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

Kompilator wrócił następujący kod błędu:

/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 

Czy ktoś pomysł jak to naprawić ?

[EDIT]

Coś naprawdę interesujący natknąłem się na to, że jeśli zadzwonić Curl-config masz kilka opcji kompilatora.

+0

Dlaczego oznaczyłeś [tag: linux] i [tag: ubuntu], jeśli dodajesz "windows.h'? ... – LPs

+0

@LPs Przeczytaj, co napisałem w moim pierwszym zdaniu. Zrobiłem crosscompile na Ubuntu aka Linux, a mój problem leży w ścieżce crosscompile Linuksa. – Qubasa

Odpowiedz

0

Więc moje rozwiązanie tego problemu prawdopodobnie leży tutaj: Cross compile tips for libraries

Oto kilka porad i wskazówek na krzyżu kompilacji kompilatora mingw32 i kompilacja zwinięcie z moim brakującego -DCURL_STATICLIB argumentów. Nie testowałem tego jednak, ponieważ rozwiązałem problem bez zwijania.

+0

Ale to zwykle tylko pierwszy krok. Spowoduje to najprawdopodobniej uruchomienie innych problemów z łączeniem, takich jak: libcurld.lib (easy.obj): błąd LNK2019: nierozwiązany zewnętrzny symbol __imp__WSACleanup @ 0 odwołanie w funkcji _win32_init .... możesz rozwiązać ten problem przez ponowne połączenie : wldap32.lib i Ws2_32.lib http://blog.yastrebkov.com/2010/08/unresolved-externalals-while-linking.html – GregPhil

2

Biblioteka krzyżowa Używając --prefix definiujesz katalog instalacyjny toplevel.

Libs zostanie umieszczony w /usr/i686-w64-mingw32/lib

samo dla zawiera pliki będą one umieszczone /usr/i686-w64-mingw32/include

Korzystanie -L/usr/i686-w64-mingw32/ jesteś wskazując błędne ścieżki do bibliotek i cross-kompilator nie może znaleźć libcurl

Aby wskaż poprawną lokalizację, do której musisz dodać -I/usr/i686-w64-mingw32/include do swojego polecenia.

Na koniec skompilowałeś statyczne biblioteki skarbów tylko wtedy, gdy chcesz je skompilować statycznie: dodaj -static do swojego polecenia.

SO poprawna komenda będzie:

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

Wypróbowałem to, ale niestety to nie działa :(Masz jakiś inny pomysł? – Qubasa

+0

Gdzie są zainstalowane libcurl. * Czy '/ usr/i686-w64-mingw32/lib' jest poprawną ścieżką? – LPs

+0

Tak, jest tam to libcurl.a i libcurl.la – Qubasa

1

Od curls FAQ:

Jeśli pojawi się błąd linkera jak "nieznany symbol __imp__curl_easy_init ..." zostały połączone w stosunku do zła (statyczne). Jeśli chcesz używać libcurl.dll i importować lib, nie potrzebujesz żadnej dodatkowej biblioteki, ale korzystasz z jednej z poniższych bibliotek importowania. Są to biblioteki produkowane przez różne pliki lib/Makefile.Pliki *: ścieżka

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 

Spróbuj Linker -lcurl_imp lub -llibcurl_imp

Aktualizacja: Oto pisać flagi na moim Ubuntu z MinGW64:

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

Dlaczego używam libcurl_imp.lib zamiast libcurldll.a jak opisano w powyższej tabeli? Skoro buduję zwijanie za pomocą cmake, które tworzą libcurl_imp.lib. Powinieneś więc sprawdzić nazwę zbudowanej biblioteki.

+0

Próbowałem faild. Próbowałem ponownie z rekompilacją biblioteki ... nie udało się .... Nie, zatrzymam się właśnie tutaj.-.-. Myślę, że w końcu popełniłem błąd w konfiguracji lub kompilacji? Przy okazji korzystam z wersji biblioteki 7.49. Coś naprawdę interesującego, na co natknąłem się, jest to, że jeśli nazwiesz curl-config, otrzymujesz kilka opcji kompilatora, które są interesujące, ale nie pomogły w moim przypadku. – Qubasa

Powiązane problemy