【问题标题】:ws2_32.lib vs. libws2_32.a, what's the difference and how to link libws2_32 to NB project?ws2_32.lib 与 libws2_32.a,有什么区别以及如何将 libws2_32 链接到 NB 项目?
【发布时间】: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


【解决方案1】:

我遇到了这个问题 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,但结果很痛苦。

【讨论】:

    【解决方案2】:
    1. 在我看来,您已将 -lws2_32 开关添加到 C/C++ 编译器选项中。当 netbeans 调用编译器时,它会传递-c 开关,它会忽略链接器选项,例如-l。在链接器选项部分,Netbeans 有一个适当的位置来添加外部库。或者,您可以将-l 作为额外选项添加到链接器。这可能会解决问题。

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

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-09
      • 2016-11-29
      相关资源
      最近更新 更多