首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MinGW + Boost:未定义的“`WSAStartup@8”引用

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

Stack Overflow用户
提问于 2012-09-18 07:55:23
回答 1查看 13.3K关注 0票数 8

下面是我执行的

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

下面是检查有关上述symobls的库的结果(我没有以适当的方式格式化它)

`d:\MinGW\lib>nm -C libws2_32.a _ grep WSAStartup

00000000 T WSAStartup@8

00000000 I imp_WSAStartup@8

d:\MinGW\lib>nm -C libws2_32.a _ grep WSACleanup

00000000吨WSACleanup@0

00000000 I imp_WSACleanup@0

d:\MinGW\lib>nm -C libwsock32.a \ grep WSACleanup

00000000吨WSACleanup@0

00000000 I imp_WSACleanup@0

d:\MinGW\lib>nm -C libwsock32.a \ grep WSAStartup

00000000 T WSAStartup@8

00000000 I imp_WSAStartup@8`

正如我们所看到的,符号存在于库中,库位于相应的-L命令行选项所引用的位置上。

那么,为什么“未定义的推荐人”?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-18 08:04:05

这是非常常见的错误,有一个非常简单的解决方案:将链接到的库放在源文件和对象文件之后。

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

如果这样做是相反的(而且是错误的)

代码语言:javascript
复制
g++ -lB A.cpp

然后,当链接器加载库B时,库中的任何函数都不存在依赖关系,因此链接器就会丢弃该库。

所以正确的方法是把图书馆放在最后

代码语言:javascript
复制
g++ A.cpp -lB

这就是为什么许多示例总是将库放在命令行的最后。

因此,对于问题的命令行,它应该是

代码语言:javascript
复制
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之前。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12472654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档