MinGW + Boost:对“WSAStartup@8”的未定义引用

2024-01-08

下面是我执行的

D:\Just4Fun\software\>make -f Makefile.hands stest
g++.exe -g -D_WIN32_WINNT=0x0601 -ID:\Boost\boost_1_51_0 -LD:\Boost\boost_1_51_0\stage\lib -LD:\MinGW\lib -lboost_system-mgw46-d-1_51 -lboost_filesystem-mgw46-d-1_51 -lboost_iostreams-mgw46-d-1_51 -lws2_32 -lwsock32 -o TestSerial.exe TestSerial.cpp

下面是结果

C:\Users\oleg\AppData\Local\Temp\ccXpC7RG.o: In function 'ZN5boost4asio6detail17winsock_init_base7startupERNS2_4dataEhh': D:/Boost/boost_1_51_0/boost/asio/detail/impl/winsock_init.ipp:39: undefined reference to 'WSAStartup@8'C:\Users\oleg\AppData\Local\Temp\ccXpC7RG.o: In function 'ZN5boost4asio6detail17winsock_init_base7cleanupERNS2_4dataE': D:/Boost/boost_1_51_0/boost/asio/detail/impl/winsock_init.ipp:48: undefined reference to 'WSACleanup@0' collect2: ld returned 1 exit status make: *** [stest] Error 1

以下是检查有关上述符号的库的结果(我未能以适当的方式对其进行格式化)

`d:\MinGW\lib>nm -C libws2_32.a | grep WSA启动
00000000 T WSAStartup@8
00000000 我imp_WSAStartup@8

d:\MinGW\lib>nm -C libws2_32.a | grep WSA清理
00000000 T WSACleanup@0
00000000 我imp_WSACcleanup@0

d:\MinGW\lib>nm -C libwsock32.a | grep WSA清理
00000000 T WSACleanup@0
00000000 我imp_WSACcleanup@0

d:\MinGW\lib>nm -C libwsock32.a | grep WSA启动
00000000 T WSAStartup@8
00000000 我imp_WSAStartup@8`

正如我们所看到的,符号存在于库中,并且库位于相应的 -L 命令行选项引用的位置。
那么,为什么“未定义的参考”???


这是非常常见的错误,有一个非常简单的解决方案:放置您链接的库after源文件和目标文件。


如果对象(或源)文件 A 依赖于库 B,则链接时在命令行上 A 必须位于 B 之前。这是因为 GNU(可能还有其他)链接器如何解决符号依赖性。

如果以相反(且错误)的方式进行

g++ -lB A.cpp

那么当链接器加载库 B 时,库中的任何函数都没有依赖项,因此链接器只是丢弃该库。

所以正确的做法是把库放在最后

g++ A.cpp -lB

这就是许多示例总是放置库的原因last在命令行上。

所以对于问题的命令行,它应该是

g++.exe -g -D_WIN32_WINNT=0x0601 -ID:\Boost\boost_1_51_0 \
    -LD:\Boost\boost_1_51_0\stage\lib -LD:\MinGW\lib \
    -o TestSerial.exe TestSerial.cpp \
    -lboost_system-mgw46-d-1_51 -lboost_filesystem-mgw46-d-1_51 -lboost_iostreams-mgw46-d-1_51 -lws2_32 -lwsock32

此顺序对于库间依赖关系也很重要。如果库 L1 依赖于库 L2,则命令行上 L1 必须位于 L2 之前。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MinGW + Boost:对“WSAStartup@8”的未定义引用 的相关文章

随机推荐