4

我使用带有 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 Option...按钮中添加这样的选项:

Add Option... -> Other option ->    // and I input here "-lws2_32"

但无论我做什么,我都无法从 NB 运行项目,我得到 error undefined reference to '_WSAStartup@8'

所以我的问题是:

1)我做错了什么?如何直接从 NB 运行项目?我没有尝试安装 Windows SDK,我想尝试使用 Cygwin 工具,因为它具有此类工具。

.lib2) Windows文件和 Cygwin文件有什么区别.a?安装 Windows SDK 并忘记这些.a文件会更好吗?到目前为止,我在 Cygwin 网站上能找到的关于它们的一切都是这样的:

导入库是一个常规的类 UNIX .a 库,但它只包含告诉操作系统您的程序如何与(“导入”)dll 交互所需的少量信息。此信息链接到您的 .exe。这也是由 dlltool 生成的。

3)是否可以使用#pragma comment(lib, "libws2_32.a")链接.a文件?我试过但没有得到成功的结果。

升级版:

第三个问题的答案-> Linux 下的#pragma comment(lib, "xxx.lib") 等效?

4

2 回答 2

8

我有这个问题 Eclipse/CDT/Windows。这是我的构建命令

g++ -O0 -g3 -Wall -c -fmessage-length=0 -o source\Sever_B.o ..\source\Sever_B.cpp
g++ -LC:\MinGW\lib -o Sever_B.exe source\Sever_B.o -lws2_32

所以关于 Eclipse 项目属性,C/C++ General, Paths & Symbols

  • 将 C:\MinGW\lib 添加到库路径选项卡
  • 将 ws2_32 添加到库选项卡

这将 libws2_32.a 链接到我的项目,现在可以构建。

我尝试使用 Windows ws2_32.dll 和 ws2_32.lib,除了痛苦什么也没有。

于 2012-11-09T08:17:49.960 回答
4
  1. 在我看来,您已将-lws2_32开关添加到 C/C++ 编译器选项。当 netbeans 调用编译器时,它会传递-c开关,它会忽略链接器选项,例如-l. 在链接器选项部分,Netbeans 有一个适当的位置来添加外部库。或者,您可以将-l作为额外选项添加到链接器。那可能会解决问题。

  2. *.lib文件由 Microsoft 工具链 (cl.exe)lib*.a使用,并由 GNU 工具链使用(这是您找到的 adivse)。如果您要使用 Cygwin,则需要这些lib*.a文件。在这种情况下,拥有 Microsoft SDK 对您毫无帮助。此外,如果您需要一个仅存在于.lib format, you can convert to.a` 中的文件,请使用名为reimp的工具。

希望这可以帮助。

于 2012-09-09T16:44:09.467 回答