【问题标题】:Undefined reference in an object file - how find which library contains it?目标文件中未定义的引用 - 如何找到包含它的库?
【发布时间】:2017-05-30 16:36:54
【问题描述】:

我已经用 Windows mingw 成功编译了 openssl 库...然后我将它与我的应用程序链接,但它失败了,出现未解析的符号 _imp__shutdownnm 告诉目标文件确实引用了该符号。

如何找出应该将哪个库添加到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

【问题讨论】:

  • shutdown() 函数的文档应该告诉你链接哪个库。
  • 这看起来可能是名称修改问题。你有extern "C"shutdown()的声明吗?
  • 鉴于其他符号的名称,这可能是函数:msdn.microsoft.com/en-us/library/windows/desktop/ms740481.aspx
  • _imp__shutdown@8 != __imp__shutdown@8
  • 看起来该函数属于libws2_32.a(已链接),但下划线确实不同:-|

标签: c++ c linker


【解决方案1】:

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

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

要回答您提出的实际问题,如果您想查找哪个库提供了函数,请转到该函数的文档,例如需要链接到Ws2_32.libshutdown函数文档

【讨论】:

  • 你救了我!进行此更改后,我的应用程序可以正常构建。
猜你喜欢
  • 1970-01-01
  • 2015-06-08
  • 1970-01-01
  • 1970-01-01
  • 2014-05-01
  • 2018-11-14
  • 2019-11-22
  • 1970-01-01
  • 2016-07-05
相关资源
最近更新 更多