我已经使用Windows mingw成功编译了openssl库。然后将其链接到我的应用程序,但是由于未解析的符号_imp__shutdown
而失败。 nm
告诉目标文件确实引用了该符号。
如何找到应该添加到ld
的库来解决这种依赖性?是否有针对此类情况的标准程序?
连结:
> g++ -static -Wl,--allow-multiple-definition -mthreads -Wl,-subsystem,windows ... -lws2_32 -lshlwapi ... -lssl -lcrypto ...
C:/openssl-1.0.1g-mgw\libcrypto.a(bss_sock.o):bss_sock.c:(.text+0x90): undefined reference to `_imp__shutdown@8'
C:/openssl-1.0.1g-mgw\libcrypto.a(bss_sock.o):bss_sock.c:(.text+0x1a0): undefined reference to `_imp__shutdown@8'
c:/MinGW/bin/../lib/gcc/i686-w64-mingw32/4.8.2/../../../../i686-w64-mingw32/bin/ld.exe: C:/openssl-1.0.1g-mgw\libcrypto.a(bss_sock.o): bad reloc address 0x4 in section `.data'
collect2.exe: error: ld returned 1 exit status
未解决的符号:
> nm /c/openssl-1.0.1g-mgw/crypto/bio/bss_sock.o
...
U __imp__closesocket@4
U __imp__recv@16
U __imp__send@16
U __imp__shutdown@8
U __imp__WSAGetLastError@0
U __imp__WSASetLastError@4
...
GCC / Windows 7 x64:
> g++ --version
g++.exe (i686-posix-dwarf-rev3, Built by MinGW-W64 project) 4.8.2
最佳答案
由于您正在使用gcc进行静态链接,因此需要以相反的顺序提供库。如果需要解决循环依赖关系,则必须在命令行上多次提供库名称(例如,如果libfoo依赖于libbar,而libbar依赖于libfoo,请执行-lfoo -lbar -lfoo)
在这种情况下,由于-lssl
取决于ws2_32
库中定义的这些套接字函数,因此请在-lws2_32
之后添加-lssl
为了回答您提出的实际问题,如果要查找哪个库提供了功能,请转到该功能的文档,例如您需要链接到Ws2_32.lib
的shutdown函数文档