неопределенная ссылка на '_WSAStartup@8'. Как связать библиотеки с NetBeans?

Я использую 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. И если я пытаюсь запустить проект из NB (кнопка [F6]), у меня всегда возникает эта ошибка неопределенная ссылка на '_WSAStartup@8'.

Я уже перепробовал все, что мог найти на форумах NB. Я пытался связать libws2_32.a со своим проектом таким образом. Я иду к:

File -> Project Properties -> Linker -> Libraries

И есть три варианта:

Add Library...
Add Library File...
Add Option...

Я пробовал их все. Я пытался связать только Add Library... и Add Library File.... Я также пытался добавить такую ​​опцию в кнопку Add Option...:

Add Option... -> Other option ->    // and I input here "-lws2_32"

Но что бы я ни делал, я не могу запустить проект из NB, я получаю сообщение об ошибке undefined reference to '_WSAStartup@8'.

Так что похоже, что это не проблема (ошибка) в коде. Похоже, проблема с NB, с его возможностью линковать библиотеки. Или я делаю неправильные шаги, чтобы прикрепить их к проекту.

Итак, мои вопросы:

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 файлов? Я пробовал, но не добился успеха.


person Green    schedule 09.09.2012    source источник
comment
возможный дубликат ws2_32.lib и libws2_32.a, в чем разница и как связать libws2_32 с проектом NB?   -  person Blastfurnace    schedule 09.09.2012


Ответы (2)


1) Что я делаю не так? Как я могу запустить проект прямо из NB? Я не пытался установить Windows SDK, я хочу попробовать инструменты Cygwin, поскольку у него есть такие инструменты.

Попробуйте следующее: http://forums.netbeans.org/ptopic44959.html

2) В чем разница между файлами Windows .lib и файлами Cygwin .a? Не лучше ли установить Windows SDK и просто забыть об этих файлах .a?

Оба этих файла в данном конкретном случае называются «библиотеками импорта». Библиотеки импорта в основном представляют собой файл, содержащий список допустимых функций, поэтому, когда вы связываете свой exe, компоновщик знает, что эти функции будут существовать в какой-то конкретной DLL. Таким образом, когда вы создаете ссылку на wsock32.lib или ws2_32.lib, компоновщик теперь знает, что эти функции будут существовать в wsock32.dll и ws2_32.dll. Таким образом, он не будет жаловаться. Теперь формат библиотеки импорта .lib — это формат Microsoft. GCC/unix/linux/mingw/cygwin и т. д. имеют другой формат, и расширение для этого формата — .a. Теперь cygwin/mingw и т. д. предоставляют ws2_32.a, чтобы при использовании cygwin/mingw/gcc компоновщик мог считывать библиотеку импорта в правильном формате. cygwin/mingw/gcc просто не поймет .lib. Microsoft предоставляет файлы .lib в своем SDK, но я не уверен, как это поможет в данном случае. (Хотя SDK является определенно полезным, поскольку он предоставляет множество файлов заголовков и DLL для других полезных вещей, которые могут вам понадобиться, но библиотеки импорта бесполезны, потому что gcc/mingw /cygwin их не поймет; если только вы не используете инструмент преобразования, подобный упомянутому в вашем повторяющийся вопрос).

3) Можно ли использовать комментарий #pragma(lib, "libws2_32.a") для ссылки на файлы .a? Я пробовал, но не добился успеха.

Нет, комментарии, связывающие #pragma, являются специфичным для MSVC (уродливым IMO) расширением. Используйте параметры компоновщика в меню.

person Realz Slaw    schedule 10.09.2012
comment
Я открыл этот вопрос. Я не могу связать ws2_32 со своим проектом . Пожалуйста, посмотрите, если вы знаете, как на него ответить - person dimitris93; 09.04.2016

затмение, Cygwin

свойства -> Сборка C/C++ -> Настройки -> Cygwin C Linker

Шаблон командной строки

добавить к -lws2_32

ex)${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS} -lws2_32

person Ackles Park    schedule 21.10.2016