MinGW + Boost:未定义对"WSAStartup@8"的引用
MinGW + Boost: undefined reference to `WSAStartup@8'
下面是我执行的内容
D:Just4Funsoftware>make -f Makefile.hands stest
g++.exe -g -D_WIN32_WINNT=0x0601 -ID:Boostboost_1_51_0 -LD:Boostboost_1_51_0stagelib -LD:MinGWlib -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:UsersolegAppDataLocalTempccXpC7RG.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:UsersolegAppDataLocalTempccXpC7RG.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 WSAStartup
00000000 T WSAStartup@8
00000000 I imp_WSAStartup@8
d:\MinGW\lib>nm -C libws2_32.a | grep WSACleanup
00000000 T WSACleanup@0
00000000 我imp_WSACleanup@0
d:\MinGW\lib>nm -C libwsock32.a | grep WSACleanup
00000000 T WSACleanup@0
00000000 我imp_WSACleanup@0
d:\MinGW\lib>nm -C libwsock32.a | grep WSAStartup
00000000 T WSAStartup@8
00000000 我_WSAStartup@8'
如我们所见,函数库中存在符号,并且库位于相应的 -L 命令行选项引用的位置。
那么,为什么是"未定义的引用"????
这是一个非常常见的错误,有一个非常简单的解决方案:将链接的库放在源文件和目标文件之后。
如果对象(或源)文件 A 依赖于库 B,则链接时 A 必须在命令行上的 B 之前。这是因为 GNU(可能还有其他)链接器如何解决符号依赖关系。
如果以相反(和错误)的方式做
g++ -lB A.cpp
然后,当链接器加载库 B 时,对库中的任何函数都没有依赖关系,因此链接器只是丢弃该库。
所以正确的方法是把库放在最后
g++ A.cpp -lB
这就是为什么许多示例总是将库放在命令行的最后。
所以对于问题的命令行,它应该是
g++.exe -g -D_WIN32_WINNT=0x0601 -ID:Boostboost_1_51_0
-LD:Boostboost_1_51_0stagelib -LD:MinGWlib
-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 之前。
- 将对象数组的引用传递给函数
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 何时在引用或唯一指针上使用移动语义
- 如何在c++中使用引用实现类似python的行为
- 编译C++时未定义的引用
- Ctypes wstring通过引用传递
- c++r值引用应用于函数指针
- 理解c++中的引用
- C++取消引用指针.为什么会发生变化
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 强制转换为引用类型
- 引用一个已擦除类型(void*)的指针
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 具有默认值的引用获取函数
- 如何使用基类指针引用派生类成员
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- MinGW + Boost:未定义对"WSAStartup@8"的引用