NetBeans、Windows、および Cygwin と g++ コンパイラを使用しています。
Windows Sockets 2 を調べています。MS のマニュアルに書かれていることはすべて実行しています。私はコードを持っています(主にこのマニュアルから):
#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 を使用しています。[F6]
そして、NB (ボタン)からプロジェクトを実行しようとすると、常にこのエラーが発生しますundefined reference to '_WSAStartup@8'
。
NBフォーラムで見つけたものはすべて試しました。libws2_32.a
この方法でプロジェクトにリンクしようとしました。私は行きます:
File -> Project Properties -> Linker -> Libraries
次の 3 つのオプションがあります。
- ライブラリを追加...
- ライブラリ ファイルを追加...
- オプションを追加...
私はそれらすべてを試しました。ライブラリとライブラリ ファイルの両方をリンクしようとしました。Add Option...
ボタンにそのようなオプションを追加しようとしました:
Add Option... -> Other option -> // and I input here "-lws2_32"
しかし、何をしてもNBからプロジェクトを実行できず、エラーが発生しますundefined reference to '_WSAStartup@8'
。
だから私の質問は:
1) 私は何を間違っていますか? プロジェクトを NB から直接実行するにはどうすればよいですか? 私は Windows SDK をインストールしようとはしませんでした。Cygwin ツールにはそのような種類のツールがあるので試してみたいと思います。
.lib
2) Windowsファイルと Cygwinファイルの違いは何.a
ですか? .a
Windows SDK をインストールして、それらのファイルを忘れた方がよいでしょうか? Cygwinサイトでこれまでに見つけたものはすべて次のとおりです。
インポート ライブラリは、通常の UNIX ライクな .a ライブラリですが、プログラムが dll とどのように対話 (「インポート」) するかを OS に伝えるために必要なごくわずかな情報しか含まれていません。この情報は、.exe にリンクされています。これも dlltool によって生成されます。
3)ファイル#pragma comment(lib, "libws2_32.a")
をリンクするために使用することは可能ですか? .a
試してみましたが、成功の結果が得られませんでした。
更新:
3 番目の質問に対する回答 -> #pragma comment(lib, "xxx.lib") は Linux で同等ですか?