0

我想编写一个静态库,它使用来自 winsock api(winsock 包装库)的函数。我包括 libws2_32.a 并添加编译器选项 -lws2_32。现在当我在另一个项目中链接到这个库时,它给了我这些错误:

undefined reference to `__imp_WSAStartup'|

对于我在我的库中使用的各种 winsock 函数。我在包含库的项目中包含了 libws2_32.a 并添加了选项 -lws2_32。我正在使用 CodeBlocks IDE 和 MinGW 64 位编译器。我怎样才能解决这个问题?甚至可以编写这样一个静态包装库吗?

编辑 1我删除了编译器选项 -lws2_32 并且新的构建日志看起来像这样。但是,它仍然具有对 winsock 函数错误的未定义引用。

-------------- Build: Debug in LibX (compiler: MinGW 64bit + posix threads)---------------

x86_64-w64-mingw32-g++.exe -std=c++11 -Wall -fexceptions -g -std=c++11 -ID:\Misc\CodeBlocksProjects\LibX\src -c D:\Misc\CodeBlocksProjects\LibX\src\error.cpp -o obj\Debug\src\error.o
x86_64-w64-mingw32-g++.exe -std=c++11 -Wall -fexceptions -g -std=c++11 -ID:\Misc\CodeBlocksProjects\LibX\src -c D:\Misc\CodeBlocksProjects\LibX\src\filter.cpp -o obj\Debug\src\filter.o
x86_64-w64-mingw32-g++.exe -std=c++11 -Wall -fexceptions -g -std=c++11 -ID:\Misc\CodeBlocksProjects\LibX\src -c D:\Misc\CodeBlocksProjects\LibX\src\math\group.cpp -o obj\Debug\src\math\group.o
x86_64-w64-mingw32-g++.exe -std=c++11 -Wall -fexceptions -g -std=c++11 -ID:\Misc\CodeBlocksProjects\LibX\src -c D:\Misc\CodeBlocksProjects\LibX\src\math\matrix.cpp -o obj\Debug\src\math\matrix.o
x86_64-w64-mingw32-g++.exe -std=c++11 -Wall -fexceptions -g -std=c++11 -ID:\Misc\CodeBlocksProjects\LibX\src -c D:\Misc\CodeBlocksProjects\LibX\src\math\ring.cpp -o obj\Debug\src\math\ring.o
x86_64-w64-mingw32-g++.exe -std=c++11 -Wall -fexceptions -g -std=c++11 -ID:\Misc\CodeBlocksProjects\LibX\src -c D:\Misc\CodeBlocksProjects\LibX\src\math\vector.cpp -o obj\Debug\src\math\vector.o
x86_64-w64-mingw32-g++.exe -std=c++11 -Wall -fexceptions -g -std=c++11 -ID:\Misc\CodeBlocksProjects\LibX\src -c D:\Misc\CodeBlocksProjects\LibX\src\net\http.cpp -o obj\Debug\src\net\http.o
x86_64-w64-mingw32-g++.exe -std=c++11 -Wall -fexceptions -g -std=c++11 -ID:\Misc\CodeBlocksProjects\LibX\src -c D:\Misc\CodeBlocksProjects\LibX\src\net\tcpclient.cpp -o obj\Debug\src\net\tcpclient.o
x86_64-w64-mingw32-g++.exe -std=c++11 -Wall -fexceptions -g -std=c++11 -ID:\Misc\CodeBlocksProjects\LibX\src -c D:\Misc\CodeBlocksProjects\LibX\src\net\wsa.cpp -o obj\Debug\src\net\wsa.o
x86_64-w64-mingw32-g++.exe -std=c++11 -Wall -fexceptions -g -std=c++11 -ID:\Misc\CodeBlocksProjects\LibX\src -c D:\Misc\CodeBlocksProjects\LibX\src\string\stringcomparison.cpp -o obj\Debug\src\string\stringcomparison.o
x86_64-w64-mingw32-g++.exe -std=c++11 -Wall -fexceptions -g -std=c++11 -ID:\Misc\CodeBlocksProjects\LibX\src -c D:\Misc\CodeBlocksProjects\LibX\src\string\stringx.cpp -o obj\Debug\src\string\stringx.o
x86_64-w64-mingw32-g++.exe -std=c++11 -Wall -fexceptions -g -std=c++11 -ID:\Misc\CodeBlocksProjects\LibX\src -c D:\Misc\CodeBlocksProjects\LibX\src\thread.cpp -o obj\Debug\src\thread.o
x86_64-w64-mingw32-g++.exe -std=c++11 -Wall -fexceptions -g -std=c++11 -ID:\Misc\CodeBlocksProjects\LibX\src -c D:\Misc\CodeBlocksProjects\LibX\src\timer.cpp -o obj\Debug\src\timer.o
x86_64-w64-mingw32-g++.exe -std=c++11 -Wall -fexceptions -g -std=c++11 -ID:\Misc\CodeBlocksProjects\LibX\src -c D:\Misc\CodeBlocksProjects\LibX\src\xml\xml.cpp -o obj\Debug\src\xml\xml.o
x86_64-w64-mingw32-g++.exe -std=c++11 -Wall -fexceptions -g -std=c++11 -ID:\Misc\CodeBlocksProjects\LibX\src -c D:\Misc\CodeBlocksProjects\LibX\src\xml\xmlattribute.cpp -o obj\Debug\src\xml\xmlattribute.o
cmd /c if exist bin\Debug\libLibX.a del bin\Debug\libLibX.a
ar.exe -r -s bin\Debug\libLibX.a obj\Debug\src\error.o obj\Debug\src\filter.o obj\Debug\src\math\group.o obj\Debug\src\math\matrix.o obj\Debug\src\math\ring.o obj\Debug\src\math\vector.o obj\Debug\src\net\http.o obj\Debug\src\net\tcpclient.o obj\Debug\src\net\wsa.o obj\Debug\src\string\stringcomparison.o obj\Debug\src\string\stringx.o obj\Debug\src\thread.o obj\Debug\src\timer.o obj\Debug\src\xml\xml.o obj\Debug\src\xml\xmlattribute.o
ar.exe: creating bin\Debug\libLibX.a
Output file is bin\Debug\libLibX.a with size 700.42 KB

-------------- Build: Debug in Stock (compiler: MinGW 64bit + posix threads)---------------

x86_64-w64-mingw32-g++.exe -std=c++11 -Wall -fexceptions -std=c++11 -g -std=c++11 -ID:\Misc\CodeBlocksProjects\Stock\src -ID:\Misc\CodeBlocksProjects\LibX\src -c D:\Misc\CodeBlocksProjects\Stock\src\main.cpp -o obj\Debug\src\main.o
x86_64-w64-mingw32-g++.exe -std=c++11 -Wall -fexceptions -std=c++11 -g -std=c++11 -ID:\Misc\CodeBlocksProjects\Stock\src -ID:\Misc\CodeBlocksProjects\LibX\src -c D:\Misc\CodeBlocksProjects\Stock\src\stock.cpp -o obj\Debug\src\stock.o
x86_64-w64-mingw32-g++.exe -std=c++11 -Wall -fexceptions -std=c++11 -g -std=c++11 -ID:\Misc\CodeBlocksProjects\Stock\src -ID:\Misc\CodeBlocksProjects\LibX\src -c D:\Misc\CodeBlocksProjects\Stock\src\x\console.cpp -o obj\Debug\src\x\console.o
x86_64-w64-mingw32-g++.exe -LD:\Misc\CodeBlocksProjects\LibX\src -o bin\Debug\Stock.exe obj\Debug\src\main.o obj\Debug\src\stock.o obj\Debug\src\x\console.o   D:\Misc\CodeBlocksProjects\LibX\bin\Debug\libLibX.a "C:\Program Files (x86)\CodeBlocks\MinGW\lib\libws2_32.a"
D:\Misc\CodeBlocksProjects\LibX\bin\Debug\libLibX.a(wsa.o): In function `startWSA()':
D:/Misc/CodeBlocksProjects/LibX/src/net/wsa.cpp:9: undefined reference to `__imp_WSAStartup'
D:\Misc\CodeBlocksProjects\LibX\bin\Debug\libLibX.a(wsa.o): In function `stopWSA()':
D:/Misc/CodeBlocksProjects/LibX/src/net/wsa.cpp:14: undefined reference to `__imp_WSACleanup'
D:\Misc\CodeBlocksProjects\LibX\bin\Debug\libLibX.a(tcpclient.o): In function `TcpClient::connect(std::string, int)':
D:/Misc/CodeBlocksProjects/LibX/src/net/tcpclient.cpp:21: undefined reference to `__imp_socket'
D:/Misc/CodeBlocksProjects/LibX/src/net/tcpclient.cpp:29: undefined reference to `__imp_inet_addr'
D:/Misc/CodeBlocksProjects/LibX/src/net/tcpclient.cpp:33: undefined reference to `__imp_gethostbyname'
D:/Misc/CodeBlocksProjects/LibX/src/net/tcpclient.cpp:48: undefined reference to `__imp_inet_addr'
D:/Misc/CodeBlocksProjects/LibX/src/net/tcpclient.cpp:51: undefined reference to `__imp_htons'
D:/Misc/CodeBlocksProjects/LibX/src/net/tcpclient.cpp:54: undefined reference to `__imp_connect'
D:\Misc\CodeBlocksProjects\LibX\bin\Debug\libLibX.a(tcpclient.o): In function `TcpClient::disconnect()':
D:/Misc/CodeBlocksProjects/LibX/src/net/tcpclient.cpp:64: undefined reference to `__imp_closesocket'
D:\Misc\CodeBlocksProjects\LibX\bin\Debug\libLibX.a(tcpclient.o): In function `TcpClient::send(char const*, unsigned int)':
D:/Misc/CodeBlocksProjects/LibX/src/net/tcpclient.cpp:74: undefined reference to `__imp_send'
D:\Misc\CodeBlocksProjects\LibX\bin\Debug\libLibX.a(tcpclient.o): In function `TcpClient::recv(char*, unsigned int)':
D:/Misc/CodeBlocksProjects/LibX/src/net/tcpclient.cpp:94: undefined reference to `__imp_recv'
collect2.exe: error: ld returned 1 exit status

编辑 2我尝试在包含我的静态库的项目中调用 WSAStartup(ws2_32 中的 winsock 函数),并且使用编译器选项 -lws2_32 可以正常工作。实际上现在(当我在项目“Stock”中调用 WSAStartup 时)对于包含的静态库也不会抛出对 WSAStartup 函数的未定义引用错误。但是,所有其他 winsock 函数仍然存在此错误。

4

1 回答 1

0

Codeblocks 使用 GCC 和 GCC 链接器来构建您的应用程序。GCC 链接器在依赖于它们的命令行上的文件之后需要依赖。

由于您已添加-lws2_32它,因此它已添加到您的库之前,以及依赖于它的任何内容之前,这会导致库被默默地丢弃。这也意味着所有具有相同名称的库(如与库的第二个链接ws2_32)也将被丢弃。

解决方案很简单:删除您的-lws2_32.

于 2014-05-22T14:11:56.443 回答