对象文件中的未定义引用-如何查找包含它的库?

Pav*_*sov 0 c c++ linker

我已经使用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
Run Code Online (Sandbox Code Playgroud)

未解决的符号:

> 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
            ...
Run Code Online (Sandbox Code Playgroud)

GCC / Windows 7 x64:

> g++ --version
g++.exe (i686-posix-dwarf-rev3, Built by MinGW-W64 project) 4.8.2
Run Code Online (Sandbox Code Playgroud)

nos*_*nos 5

由于您正在使用gcc进行静态链接,因此需要以相反的顺序提供库。如果需要解决循环依赖性,则必须在命令行上多次提供库名称(例如,如果libfoo依赖于libbar,而libbar依赖于libfoo,请执行-lfoo -lbar -lfoo)

在这种情况下,由于-lssl依赖于ws2_32库中定义的这些套接字函数,因此请-lws2_32-lssl

为了回答您提出的实际问题,如果要查找哪个库提供了功能,请转至该功能的文档,例如需要链接到的关机功能文档。Ws2_32.lib