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

Cross compiled C Windows libcurl doesn't get linked correctly on Ubuntu

我目前正在尝试在 Windows 32x 和 Ubuntu 64x 14.04 上交叉编译 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 您正在定义顶层安装目录。

库将被放入 /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 然后你想静态编译它们:添加 -static 到你的命令。

所以正确的命令是:

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

来自curls FAQ

If you get linker error like "unknown symbol __imp__curl_easy_init ..." you have linked against the wrong (static) library. If you want to use the libcurl.dll and import lib, you don't need any extra CFLAGS, but use one of the import libraries below. These are the libraries produced by the various lib/Makefile.* files:

   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 而不是上面 table 中描述的 libcurldll.a?因为我用 cmake 构建了 curl,它使 libcurl_imp.lib。所以你应该检查构建库的名称。

所以我对这个问题的解决方案可能就在这里: Cross compile tips for libraries

这些是交叉编译编译器 mingw32 和带有我缺少的参数的 curl 编译的一些提示和技巧 -DCURL_STATICLIB。我没有对此进行测试,因为我在没有卷曲的情况下解决了这个问题。