MinGW 链接器错误:winsock

Posted

技术标签:

【中文标题】MinGW 链接器错误:winsock【英文标题】:MinGW linker error: winsock 【发布时间】:2011-01-03 06:23:29 【问题描述】:

我在 Windows 上使用 MinGW 编译器来编译带有套接字的 C++ 应用程序。我的链接命令如下:

g++.exe -Wall -Wno-long-long -pedantic -lwsock32 -o dist/Windows/piskvorky  there are a lot of object files 

我也试过了

g++.exe -Wall -Wno-long-long -pedantic -lws2_32 -o dist/Windows/piskvorky  there are a lot of object files 

但在这两种情况下我都会收到此错误:

build/Windows/MinGW-Windows/src/utils/tcpunit.o:tcpunit.cpp:(.text+0x33): undefined reference to `closesocket@4'
build/Windows/MinGW-Windows/src/utils/tcpunit.o:tcpunit.cpp:(.text+0xd0): undefined reference to `send@16'
build/Windows/MinGW-Windows/src/utils/tcpunit.o:tcpunit.cpp:(.text+0x1ee): undefined reference to `recv@16'
build/Windows/MinGW-Windows/src/utils/tcpdevice.o:tcpdevice.cpp:(.text+0x184): undefined reference to `WSAStartup@8'
build/Windows/MinGW-Windows/src/utils/tcpdevice.o:tcpdevice.cpp:(.text+0x1a5): undefined reference to `closesocket@4'
build/Windows/MinGW-Windows/src/utils/tcpdevice.o:tcpdevice.cpp:(.text+0x1cb): undefined reference to `closesocket@4'
build/Windows/MinGW-Windows/src/utils/tcpdevice.o:tcpdevice.cpp:(.text+0x1d3): undefined reference to `WSACleanup@0'
build/Windows/MinGW-Windows/src/utils/tcpdevice.o:tcpdevice.cpp:(.text+0x6fe): undefined reference to `bind@12'
build/Windows/MinGW-Windows/src/utils/tcpdevice.o:tcpdevice.cpp:(.text+0x724): undefined reference to `listen@8'
build/Windows/MinGW-Windows/src/utils/tcpdevice.o:tcpdevice.cpp:(.text+0x7f0): undefined reference to `gethostbyaddr@12'
build/Windows/MinGW-Windows/src/utils/tcpdevice.o:tcpdevice.cpp:(.text+0x83c): undefined reference to `socket@12'
build/Windows/MinGW-Windows/src/utils/tcpdevice.o:tcpdevice.cpp:(.text+0x86f): undefined reference to `htons@4'
build/Windows/MinGW-Windows/src/utils/tcpdevice.o:tcpdevice.cpp:(.text+0x8b5): undefined reference to `connect@12'
build/Windows/MinGW-Windows/src/utils/tcpdevice.o:tcpdevice.cpp:(.text+0x9c6): undefined reference to `accept@12'

请问您知道问题出在哪里吗?

【问题讨论】:

piškvorky se socketama? :D @Matous 对,游戏有网络模式 【参考方案1】:

-lws2_32 放在目标文件列表之后 - GCC 按照它们在命令行中出现的顺序搜索库和目标文件。

只是为了帮助其他观众:

gcc hello.c -o hello.o -lws2_32

【讨论】:

【参考方案2】:

在 Eclipse 上使用 MinGW:

Menu >> Project >> Properties >> C/C++ Build >> Settings: Register "Tool Settings" - MinGW C Linker - Miscellaneous: Lower Part "other objects"

添加:例如“D:\Programmierung\mingw\lib\libwsock32.a”。不需要任何其他属性上的 libwsock32.a 的其他条目,尤其是在库条目中。也没有与此 Lib 相关的标志。

【讨论】:

答案是英文的……路径不是,但这应该不是问题。【参考方案3】:

在:

菜单-项目-属性-c/c++Build-设置:注册“工具设置”-MinGW C++链接器-杂项:下半部分“其他对象”

MinGW 的 bin 文件夹中添加:libwsock32.a

【讨论】:

【参考方案4】:

您好,我刚刚解决了上述问题....

所以这里首先是一些观察......

我知道你指的是 MinGw,但你可能需要 cygwin 来解决这个问题,我不太了解 mingw,我更了解 cygwin。但我知道他们是堂兄弟。

Cygwin 带有预编译的 boost 库,但谁知道它们是哪个版本。我确定可以检查,但谁有时间去做呢?我没有链接到 cygwin boost 库或 mingw boost 库,我在 windows (cygwin) 上使用 gcc 从头开始​​构建 boost。编译没问题。

在撰写本文时,我相信的版本是 1.47.0。

cygwin 使用版本 (x?) 并且 boost 是 1.47.0 的事实已经可能是一个主要问题。让你知道你在用什么方式来提升。

我使用的是在 boost 1.42 上开发的代码,并且出现了相关的链接器错误。编译了代码,找到了头文件,等等......但是我得到了对 WSA 等的未定义引用......等等......打开套接字,关闭套接字,等等......

所以,显然,为了做网络套接字,boost 需要一个平台库,其中以 ws2_32 for windows 的形式找到,而对于 linux 肯定是 socket。

因此,如果您正确使用 boost,并包含正确的 boost 系统库,您可能还需要一个特定于操作系统的库来访问某些资源(在这种情况下是网络)。

链接器错误在那之后消失。向退伍军人宣传这里发生的事情可能很明显,但我无法通过谷歌找到明确的答案。

【讨论】:

以上是关于MinGW 链接器错误:winsock的主要内容,如果未能解决你的问题,请参考以下文章

使用 mingw-w64 编译 mex 的链接器错误

链接器链接,但可执行文件要求另一个 dll

围绕winsock的BSD套接字兼容包装器?

代码块、MinGW、Boost 和静态链接问题

与 GLFW MinGW 的链接问题

将 gcc/g++ 仪器功能与 MinGW 一起使用?