我想编写一个静态库,它使用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函数仍然存在此错误。
答案 0 :(得分:0)
Codeblocks使用GCC和GCC链接器来构建您的应用程序。 GCC链接器期望在命令行上依赖于它们的文件后依赖。
由于您已添加-lws2_32
,因此它会在您的库之前添加,并且在依赖于它之前添加它,这会导致库被静默丢弃。这也意味着所有具有相同名称的库(如第二个与ws2_32
库链接)也将被丢弃。
解决方案很简单:删除-lws2_32
。