【发布时间】:2012-09-01 03:23:01
【问题描述】:
我使用带有 g++ 编译器的 NetBeans、Windows 和 Cygwin。
我正在检查 Windows Sockets 2。我做所有用 MS manual 编写的东西。我有一个代码(主要来自本手册):
#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 Option... 按钮中添加这样的选项:
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") equivalent under Linux?
【问题讨论】:
-
@HansPassant,事实上绝对不会重复我的问题。我在寻找答案时阅读了该帖子。在将其标记为重复之前,请先仔细阅读问题。
标签: c++ dll netbeans linker winsock2