交叉编译的 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。我没有对此进行测试,因为我在没有卷曲的情况下解决了这个问题。
我目前正在尝试在 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。我没有对此进行测试,因为我在没有卷曲的情况下解决了这个问题。