交叉编译的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)