c++ - ws2_32.lib vs. libws2_32.a,有什么区别以及如何将 libws2_32 链接到 NB 项目?

标签 c++ dll netbeans linker winsock2

我使用带有 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 网站上能找到的关于它们的所有信息都是:

The import library is a regular UNIX-like .a library, but it only contains the tiny bit of information needed to tell the OS how your program interacts with ("imports") the dll. This information is linked into your .exe. This is also generated by dlltool.

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

更新:

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

最佳答案

我在 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++ 通用、路径和符号

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

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

我尝试使用 Windows ws2_32.dll 和 ws2_32.lib,除了痛苦之外一无所获。

关于c++ - ws2_32.lib vs. libws2_32.a,有什么区别以及如何将 libws2_32 链接到 NB 项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12314779/

相关文章:

c++ - 标准库函数 abs() 在不同 C++ 编译器上的异常行为

c++ Intel inspector 显示许多 boost 错误 - 我需要担心吗?

.net - 是否可以通过 app.config 将 .NET dll "inject"放入另一个 .NET 应用程序?

java - 通过 NetBeans 6.7 *修订*在 SVN 中创建/访问 Maven 存储库

c++ - 查找 C 字符串中的错误

c++ - 编译 qt Creator/qt widget 示例时出错

dll - 我如何知道 dllmain 何时完成?

java - 与java应用程序的接口(interface)DLL,如何?

python - NetBeans 6.9 Python 中的 TODO 注释

ruby-on-rails - Netbeans 和 Rails 错误 : bin/ruby: No such file or directory -- script/rails (LoadError)