我使用 NetBeans、Windows 和 Cygwin 以及 g++ 编译器。
我正在研究 Windows Sockets 2。我所做的一切都是用 MS 编写的manual http://msdn.microsoft.com/en-us/library/windows/desktop/ms737629%28v=vs.85%29.aspx。我有一个代码(主要来自本手册):
#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
almost .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 Option...
button:
Add Option... -> Other option -> // and I input here "-lws2_32"
但无论我做什么,我都无法从 NB 运行该项目,我收到错误undefined reference to '_WSAStartup@8'
.
所以我的问题是:
1)我做错了什么?我怎样才能直接从 NB 运行该项目?我没有尝试安装Windows SDK,我想尝试使用Cygwin工具,因为它有这样的工具。
2) 与Windows有什么区别.lib
文件和 Cygwin.a
文件?安装 Windows SDK 并忘记这些是不是更好?.a
文件?到目前为止我在 Cygwin 网站上能找到的关于它们的所有内容如下:
导入库是一个常规的类 UNIX .a 库,但它仅
包含告诉操作系统您的情况如何所需的微小信息
程序与 dll 交互(“导入”)。此信息已链接
进入你的.exe。这也是由 dlltool 生成的。
3)是否可以使用#pragma comment(lib, "libws2_32.a")
链接.a
文件?我已经尝试过,但没有得到成功的结果。
UPD:
第三个问题的答案->#pragma comment(lib, "xxx.lib") 在 Linux 下等效吗? https://stackoverflow.com/questions/1685206/pragma-commentlib-xxx-lib-equivalent-under-linux