4

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 ツールにはそのような種類のツールがあるので試してみたいと思います。

.lib2) Windowsファイルと Cygwinファイルの違いは何.aですか? .aWindows SDK をインストールして、それらのファイルを忘れた方がよいでしょうか? Cygwinサイトでこれまでに見つけたものはすべて次のとおりです。

インポート ライブラリは、通常の UNIX ライクな .a ライブラリですが、プログラムが dll とどのように対話 (「インポート」) するかを OS に伝えるために必要なごくわずかな情報しか含まれていません。この情報は、.exe にリンクされています。これも dlltool によって生成されます。

3)ファイル#pragma comment(lib, "libws2_32.a")をリンクするために使用することは可能ですか? .a試してみましたが、成功の結果が得られませんでした。

更新:

3 番目の質問に対する回答 -> #pragma comment(lib, "xxx.lib") は Linux で同等ですか?

4

2 に答える 2

8

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 を使用してみましたが、苦痛しかありませんでした。

于 2012-11-09T08:17:49.960 に答える
4
  1. -lws2_32C/C++ コンパイラ オプションにスイッチを追加したようです。netbeans がコンパイラを呼び出すと、-cスイッチが渡され、 などのリンカー オプションが無視され-lます。リンカ オプション セクションで、Netbeans には外部ライブラリを追加するための適切な場所があります。または-l、追加オプションとしてリンカーに追加することもできます。それは問題を解決するかもしれません。

  2. *.libファイルは、Microsoft ツールチェーン (cl.exe)lib*.aによって使用され、GNU ツールチェーン (これは、見つけた adivse の一部です) によって使用されます。Cygwin を使用する場合は、lib*.aファイルが必要になります。このコンテキストでは、Microsoft SDK を使用してもまったく役に立ちません。また、 reimp.lib format, you can convert toというツールで .a` にのみ存在するファイルが必要な場合。

お役に立てれば。

于 2012-09-09T16:44:09.467 に答える