我正在使用MSYS2,而MinGW-w64通过mingw32_shell.bat环境创建了库和工具链(来自pacman repository'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
好 . 我在Makefile中添加了 -I/mingw32/include
到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
或 _curl_free
已定义,而编译器需要 _imp__curl_free
或 curl_free
.
有什么解决方案吗?