C++ MSYS2上MinGW-w64 GCC的卷曲链接错误

C++ MSYS2上MinGW-w64 GCC的卷曲链接错误,c++,gcc,curl,mingw-w64,msys2,C++,Gcc,Curl,Mingw W64,Msys2,我正在通过mingw32_shell.bat环境使用来自pacman存储库“mingw32”的MSYS2和MinGW-w64源库和工具链 我使用mingw32/mingw-w64-i686-gcc包;例如,mingw32封装的路径前缀是/mingw32,因此gcc二进制文件是/mingw32/gcc 我遇到的问题是,将cURL库与g++链接。我安装了mingw32/mingw-w64-i686-curl。它提供了/mingw32/include/curl/curl.h、/mingw32/lib/

我正在通过mingw32_shell.bat环境使用来自pacman存储库“mingw32”的MSYS2和MinGW-w64源库和工具链

我使用mingw32/mingw-w64-i686-gcc包;例如,mingw32封装的路径前缀是/mingw32,因此gcc二进制文件是/mingw32/gcc

我遇到的问题是,将cURL库与g++链接。我安装了mingw32/mingw-w64-i686-curl。它提供了/mingw32/include/curl/curl.h、/mingw32/lib/libcurl.a、/mingw32/lib/libcurl.dll.a等等。虽然此包不提供curl.pc,-lcurl不起作用。所以我跑:

$ curl-config --cflags
-I/mingw32/include
$ curl-config --libs
-L/mingw32/lib -lcurl -lidn -lrtmp -lssh2 -lssl -lcrypto -lgdi32 -lssl -lcrypto -lwldap32 -lz -lws2_32
$ curl-config --static-libs
/mingw32/lib/libcurl.a -LC:/msys64/mingw32/lib -pipe -LC:/msys64/mingw32/lib -lidn -lrtmp -lssh2 -lssl -lcrypto -lgdi32 -lssl -lcrypto -lwldap32 -lz -lws2_32
好。我将-I/mingw32/include添加到Makefile中的CXXFLAGS中,并将/mingw32/lib/libcurl.dll.a添加到Makefile中可执行链接目标的g++参数中。CXXFLAGS包含-std=c++11-fopenmp-O2-g-I

它失败了

main.o: In function `query':
C:\Users\Administrator\ngd\5/main.cc:80: undefined reference to `_imp__curl_easy_init'
main.o: In function `urlencode':
C:\Users\Administrator\ngd\5/main.cc:34: undefined reference to `_imp__curl_free'
C:\Users\Administrator\ngd\5/main.cc:29: undefined reference to `_imp__curl_easy_escape'
C:\Users\Administrator\ngd\5/main.cc:30: undefined reference to `_imp__curl_easy_escape'
main.o: In function `query':
C:\Users\Administrator\ngd\5/main.cc:88: undefined reference to `_imp__curl_easy_setopt'
C:\Users\Administrator\ngd\5/main.cc:93: undefined reference to `_imp__curl_easy_perform'
C:\Users\Administrator\ngd\5/main.cc:94: undefined reference to `_imp__curl_easy_cleanup'
collect2.exe: error: ld returned 1 exit status
main.o来自main.cc,其中包括curl/curl.h和curl函数用法

我将-DCURL\u STATICLIBS-I/mingw32/include添加到cxflags中,并将/mingw32/lib/libcurl.a添加到可执行文件的g++参数中

又失败了

main.o: In function `query':
C:\Users\Administrator\ngd\5/main.cc:80: undefined reference to `curl_easy_init'
main.o: In function `urlencode':
C:\Users\Administrator\ngd\5/main.cc:34: undefined reference to `curl_free'
C:\Users\Administrator\ngd\5/main.cc:35: undefined reference to `curl_free'
C:\Users\Administrator\ngd\5/main.cc:29: undefined reference to `curl_easy_escape'
C:\Users\Administrator\ngd\5/main.cc:30: undefined reference to `curl_easy_escape'
main.o: In function `query':
C:\Users\Administrator\ngd\5/main.cc:88: undefined reference to `curl_easy_setopt'
C:\Users\Administrator\ngd\5/main.cc:90: undefined reference to `curl_easy_setopt'
C:\Users\Administrator\ngd\5/main.cc:91: undefined reference to `curl_easy_setopt'
C:\Users\Administrator\ngd\5/main.cc:93: undefined reference to `curl_easy_perform'
C:\Users\Administrator\ngd\5/main.cc:94: undefined reference to `curl_easy_cleanup'
collect2.exe: error: ld returned 1 exit status
我所做的检查:

$ nm /mingw32/lib/libcurl.a
... (other files)
libcurl_la-escape.o:
...
00000340 T _curl_free
...
(end of libcurl_la-escape.o)
... (other files)

$ nm /mingw32/lib/libcurl.dll.a
... (other files)
d000018.o:
...
00000000 I __imp__curl_free
00000000 T _curl_free
...
(end of d000018.o)
... (other files)
所以问题是我认为定义了uu imp u curl _free或_curl _free,而编译器需要u imp u curl _free或curl _free


有什么解决办法吗?

我也有同样/类似的问题。我用错了图书馆的结构。你能检查一下吗?@ThomasSparber,当我解包libcurl.a并运行$file libcurl_la-escape.o时,结果是libcurl_la-escape.o:MS Windows COFF Intel 80386对象文件。这不是正确的架构吗?是的,这听起来很正确。不管怎样,我怀疑你使用的版本有什么问题。你有可能安装一个不同的吗?或者手动下载它。我安装了curl,结果libcurl.a包含带下划线的标识符。仍然存在链接错误。令人困惑