我正在通过 mingw32_shell.bat 环境使用 MSYS2 和 MinGW-w64 起源的库和工具链(来自 pacman 存储库'mingw32')。
我使用 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,并在 Makefile/mingw32/lib/libcurl.dll.a
的可执行链接目标中添加了 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_STATICLIBS -I/mingw32/include
到 CXXFLAGS 中,并添加到/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)
所以问题是(我认为)__imp__curl_free
or_curl_free
被定义,而编译器需要_imp__curl_free
or curl_free
。
请问有什么解决办法吗?