交叉编译的C Windows的libcurl在Ubuntu上没有正确链接

我目前正在尝试在Ubuntu 64x 14.04上为Windows 32x交叉编译libcurl。 经过一些研究后,我按照以下步骤进行:

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)执行:make

4)执行:sudo make install

然后我添加了这些包含语句:

#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

有人有关于如何解决这个问题的想法?

[编辑]

我偶然发现的一件事是,如果你调用curl-config,你会得到一堆编译器选项。


交叉编译库使用--prefix来定义顶级安装目录。

Libs将被放置到/usr/i686-w64-mingw32/lib

包含将被放置的文件/usr/i686-w64-mingw32/include

使用-L/usr/i686-w64-mingw32/您指向库的错误路径,交叉编译器无法找到libcurl

要指向正确的包含位置,您必须将-I/usr/i686-w64-mingw32/include到您的命令中。

最后你编译curl libs static,然后你想静态编译它们:add -static到你的命令。

所以正确的命令是:

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

从卷发常见问题解答:

如果你得到像“unknown symbol __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 ,如上表中所述? 同样,我使用cmake构建卷曲,这使得libcurl_imp.lib 。 所以你应该检查建立的库的名称。


所以我对这个问题的解决方案可能就在这里:交叉编译库的技巧

这些是交叉编译编译器mingw32的一些技巧和窍门,以及用我缺少的参数-DCURL_STATICLIB编译curl。 我没有测试这个,因为我解决了这个问题没有卷曲。

链接地址: http://www.djcxy.com/p/34247.html

上一篇: Cross compiled C Windows libcurl doesn't get linked correctly on Ubuntu

下一篇: Unknown error for Google APIs Intel x86 Atom System Image (Android Studio)