我目前正在尝试在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。 我没有测试这个,因为我解决了这个问题没有卷曲。