未定义引用' _WSAStartup @ 8'。如何将库与NetBeans链接?

时间:2012-09-09 12:46:29

标签: c++ dll netbeans linker winsock2

我使用NetBeans,Windows和Cygwin与G ++编译器。

我正在检查Windows套接字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]按钮)运行项目,我总是有这个错误未定义引用'_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工具,因为它有这样的工具。

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

  

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

3)是否可以使用#pragma comment(lib, "libws2_32.a")链接.a个文件?我已经尝试但没有取得成功。

2 个答案:

答案 0 :(得分:3)

  

1)我做错了什么?我怎样才能从NB运行项目?我没有尝试安装Windows SDK,我想尝试使用Cygwin工具,因为它有这样的工具。

试试这个:http://forums.netbeans.org/ptopic44959.html

  

2)Windows .lib文件和Cygwin .a文件有什么区别?是不是更好的安装Windows SDK而忘记那些.a文件?

在这种特殊情况下,这两个文件都被称为&#34;导入库&#34;。导入库基本上是一个包含有效函数列表的文件,因此当您链接exe时,链接器知道这些函数将存在于某个特定的DLL中。因此,当您链接到wsock32.lib或ws2_32.lib时,链接器现在知道这些函数将存在于wsock32.dll和ws2_32.dll中。因此,它不会抱怨。现在,.lib导入库格式是Microsoft的格式。 GCC / unix / linux / mingw / cygwin等具有不同的格式,该格式的扩展名为 .a 。现在,cygwin / mingw等提供了一个 ws2_32.a ,这样当使用cygwin / mingw / gcc时,链接器可以以正确的格式读取导入库。 cygwin / mingw / gcc根本不理解 .lib 。 Microsoft在其SDK中提供了 .lib 文件,但我不确定这在这种情况下会有什么帮助。 (虽然SDK 非常有用,因为它为你可能需要的其他有用的东西提供了很多头文件和DLL,但导入库没用,因为gcc / mingw / cygwin将无法理解它们;除非您使用转换器工具,例如duplicate question中提到的转换器工具。)

  

3)是否可以使用#pragma comment(lib,&#34; libws2_32.a&#34;)链接.a文件?我已经尝试但没有取得成功。

不,#pragma链接评论是MSVC特定(丑陋的IMO)扩展。使用菜单中的链接器选项。

答案 1 :(得分:0)

eclipse,Cygwin

propeties - &gt; C / C ++ Build - &gt;设置 - &gt; Cygwin C Linker

命令行模式

添加到-lws2_32

ex)$ {COMMAND} $ {FLAGS} $ {OUTPUT_FLAG} $ {OUTPUT_PREFIX} $ {OUTPUT} $ {INPUTS} -lws2_32