我使用带有 G++ 编译器的 NetBeans、Windows 和 Cygwin。
我正在检查 Windows Sockets 2。我做了所有在 MS手册中写的事情。我有一个代码(主要来自本手册):
#include <winsock2.h>
#include <ws2tcpip.h>
#include <cstdlib>
#include <iostream>
#pragma comment(lib, "Ws2_32.lib")
int main() {
WSADATA wsaData;
int iResult;
// Initialize Winsock
iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != 0) {
printf("WSAStartup failed: %d\n", iResult);
return 1;
}
else cout << "Initialization OK.";
return 0;
}
当我尝试运行项目时遇到问题:
undefined reference to `_WSAStartup@8'
我明白那Ws2_32.lib
是缺失的。这是因为我没有安装 Windows SDK。但在安装它之前,我想尝试一下 Cygwin 提供的工具。它有所有的w32api
头文件,我把它们放在:
C:\cygwin\usr\include\w32api
它在目录中有一些w32api
几乎.lib
文件:
C:\cygwin\lib\w32api
但是所有这些 lib 文件都是不同的,它们具有.a
扩展名和稍微不同的名称,例如:
libws2_32.a // in Cygwin
vs.
ws2_32.lib // in Windows
当我使用 Cygwin 终端创建.exe
文件时,一切正常。我输入的命令是:
cd C:\\c++\\myProgram // go to the dir
g++ myProgram.cpp -lws2_32 // compile using -l option to link libws2_32.a
之后我得到a.exe
文件。我运行它并且它有效:
./a.exe // Initialization OK.
但正如我所说,我使用的是 NetBeans。如果我尝试从 NB([F6]
按钮)运行项目,我总是有这个错误undefined reference to '_WSAStartup@8'。
我已经尝试了所有可以在 NB 论坛上找到的东西。我试图以libws2_32.a
这种方式链接到我的项目。我去:
File -> Project Properties -> Linker -> Libraries
并且有三个选项:
Add Library...
Add Library File...
Add Option...
我都试过了。我试图将两者链接Add Library...
起来Add Library File...
。我还尝试在Add Option...
按钮中添加这样的选项:
Add Option... -> Other option -> // and I input here "-lws2_32"
但无论我做什么,我都无法从 NB 运行该项目,我收到错误未定义对“_WSAStartup@8”的引用。
所以看起来这不是代码中的问题(错误)。似乎问题出在 NB 上,它有可能链接库。或者我做了错误的步骤将它们附加到项目中。
所以我的问题是:
1)我做错了什么?如何直接从 NB 运行项目?我没有尝试安装 Windows SDK,我想尝试使用 Cygwin 工具,因为它具有此类工具。
.lib
2) Windows文件和 Cygwin文件有什么区别.a
?安装 Windows SDK 并忘记这些.a
文件会更好吗?到目前为止,我在 Cygwin 网站上能找到的关于它们的一切都是这样的:
导入库是一个常规的类 UNIX .a 库,但它只包含告诉操作系统您的程序如何与(“导入”)dll 交互所需的少量信息。此信息链接到您的 .exe。这也是由 dlltool 生成的。
3)是否可以使用#pragma comment(lib, "libws2_32.a")
链接.a
文件?我试过但没有得到成功的结果。