我已经使用 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
...
海湾合作委员会/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
要回答您提出的实际问题,如果您想查找哪个库提供了某个功能,请转到该功能的文档,例如shutdown需要链接到Ws2_32.lib
关于c++ - 目标文件中 undefined reference - 如何找到哪个库包含它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44267611/