2016-05-20 92 views
7

我目前正在嘗試在Ubuntu 64x 14.04上爲Windows 32x交叉編譯libcurl。一些研究之後,我按照這些步驟:交叉編譯C Windows libcurl在Ubuntu上沒有正確鏈接

1)從https://curl.haxx.se/download.html

2下載庫)進入提取libcurl的文件夾,然後執行:

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

3)執行:使

4)執行:須藤使安裝

然後,我添加這些包括stateme 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; 
} 

現在我試圖編譯我的代碼有以下參數:

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

編譯器返回的以下錯誤代碼:

/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 

有人曾經對如何解決這一問題的想法?

[編輯]

東西真的很有趣,我偶然發現的是,如果你調用捲曲配置你一堆的編譯器選項。

+0

爲什麼你標記[tag:linux]和[tag:ubuntu]如果你包含'windows.h'? – LPs

+0

@LPs閱讀我在第一句話中陳述的內容。我在Ubuntu又名Linux上做了一個交叉編譯,我的問題在於Linux交叉編譯路徑。 – Qubasa

回答

0

所以我解決這個問題可能出在這裏: Cross compile tips for libraries

這些是交叉編譯的mingw32編譯一些提示和技巧和捲曲的我缺少的參數-DCURL_STATICLIB編譯。我沒有測試這個,因爲我解決了這個問題沒有捲曲。

+0

但這通常只是第一步。這樣做可能會導致另一個鏈接問題,如: libcurld.lib(easy.obj):錯誤LNK2019:無法解析的外部符號__imp__WSACleanup @ 0在函數中引用_win32_init .... 您可以通過再次鏈接解決此問題:wldap32.lib和Ws2_32.lib http://blog.yastrebkov.com/2010/08/unresolved-externals-while-linking.html – GregPhil

2

交叉編譯庫使用--prefix您正在定義頂層安裝目錄。

利布斯將被放置到/usr/i686-w64-mingw32/lib

同樣的事情包括將它們放置/usr/i686-w64-mingw32/include

使用您指向-L/usr/i686-w64-mingw32/文件庫和交叉編譯錯了路找不到libcurl

要指向正確的包含位置,您必須將-I/usr/i686-w64-mingw32/include添加到您的命令中。

最後你編譯curl庫靜態只有你想靜態編譯它們:加-static到你的命令。

所以正確的命令是:

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

試過它,但可悲的是它不工作:(。你有任何其他的想法? – Qubasa

+0

libcurl。*安裝在哪裏?/ usr/i686-w64-mingw32/lib'是否是正確的路徑? – LPs

+0

是的,它是在那裏是一個libcurl.a和一個libcurl.la – Qubasa

1

curls FAQ

如果你得到這樣的連接錯誤「未知符號__imp__curl_easy_init ......」你對錯誤鏈接(靜態)庫。如果 想要使用libcurl.dll和import lib,則不需要任何額外的 CFLAGS,但使用下面的一個導入庫。這些是由各種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 

嘗試路徑進行接頭-lcurl_imp-llibcurl_imp

更新:這裏是寫國旗在我的Ubuntu與MinGW64:

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

爲什麼我用libcurl_imp.lib代替libcurldll.a如上表中所述? Becouse我用cmake製作捲曲,製作libcurl_imp.lib。所以你應該檢查建立的庫的名稱。

+0

試過了faild。再次嘗試重新編譯庫...失敗....不,我要在這裏停下來 - .-。我在想,最終我在配置或編譯方面出了問題?順便說一下,我正在使用庫版本7.49。我偶然發現了一件非常有趣的事情,如果你調用curl-config,你會得到一堆有趣的編譯器選項,但對我來說沒有任何幫助。 – Qubasa