交叉编译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库静态只有你想静态编译它们: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 

从卷发常见问题解答 :

如果你得到像“未知的符号__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。 我没有测试这个,因为我解决了这个问题没有卷曲。