我使用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]
按钮)运行项目,我总是会遇到此错误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:
第3个问题的答案 - &gt; #pragma comment(lib, "xxx.lib") equivalent under Linux?
答案 0 :(得分:7)
我有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&amp;符号
这将libws2_32.a链接到我的项目,现在它构建正常。
我尝试使用Windows ws2_32.dll和ws2_32.lib,除了痛苦之外什么都没有。
答案 1 :(得分:3)
在我看来,您已将-lws2_32
开关添加到C / C ++编译器选项中。当netbeans调用编译器时,它会传递-c
开关并忽略链接器选项,例如-l
。在链接器选项部分中,Netbeans具有添加外部库的适当位置。或者您可以将-l
添加为链接器的额外选项。这可能会解决问题。
*.lib
文件由Microsoft工具链(cl.exe)使用,而lib*.a
由GNU工具链使用(这是您找到的adivse)。如果你打算使用Cygwin,你需要lib*.a
个文件。在这种情况下,拥有Microsoft SDK根本无法帮助您。此外,如果您需要一个仅存在.lib format, you can convert to
。a`的文件,并使用名为reimp的工具。
希望这有帮助。