gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:22:58 27 4
gpt4 key购买 nike

我使用带有 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com