【问题标题】:undefined reference to '_WSAStartup@8'. How to link libraries with NetBeans?未定义对“_WSAStartup@8”的引用。如何将库与 NetBeans 链接?
【发布时间】:2012-09-09 12:46:29
【问题描述】:

我使用带有 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 Library...
Add Library File...
Add Option...

我都试过了。我试图链接Add Library...Add Library File...。我也尝试在Add Option... 按钮中添加这样的选项:

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

但无论我做什么,我都无法从 NB 运行项目,我收到错误 undefined reference to '_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 文件?我试过了,但没有得到成功的结果。

【问题讨论】:

标签: c++ dll netbeans linker winsock2


【解决方案1】:

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

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

2) Windows .lib 文件和 Cygwin .a 文件有什么区别?安装 Windows SDK 并忘记那些 .a 文件会更好吗?

在这种特殊情况下,这两个文件都称为“导入库”。导入库基本上是一个包含有效函数列表的文件,因此当您链接 exe 时,链接器知道这些函数将存在于某个特定的 DLL 中。因此,当您链接到 wsock32.lib 或 ws2_32.lib 时,链接器现在知道这些函数将存在于 wsock32.dll 和 ws2_32.dll 中。因此,它不会抱怨。现在,.lib 导入库格式是微软的格式。 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, "libws2_32.a") 链接.a 文件?我试过了,但没有得到成功的结果。

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

【讨论】:

  • 我已打开 this question 我无法将 ws2_32 链接到我的项目。知道怎么回答的请看一下
【解决方案2】:

日食,Cygwin

属性 -> C/C++ 构建 -> 设置 -> Cygwin C 链接器

命令行模式

添加到 -lws2_32

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

【讨论】:

    猜你喜欢
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    • 2019-06-30
    • 1970-01-01
    相关资源
    最近更新 更多