c++ - 目标文件中 undefined reference - 如何找到哪个库包含它?

标签 c++ c linker

我已经使用 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
            ...

海湾合作委员会/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/

相关文章:

c++静态变量初始化问题 - 引用另一个静态常量

c - 如何使用 Nix 在 macOS 上构建使用 time.h 的软件

c - 来自 C 的优化 MIPS 指令立即返回?

c++ - 用 C++ 打包库

C++结构数组初始化

c++ - QT如何将Qlist传递给类构造函数

检查用户是否在 C 中输入字母或数字

c++ - 在 GCC 和 OS X 中使用 SFML 时遇到问题

c++ - 网 bean 10 : error: linker command failed with exit code 1 (use -v to see invocation)

c++ - 用于配置 cpp 源文件位置的环境变量