неопределенная ссылка на _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, я получаю ошибку неопределенная ссылка на _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 файлы? Я пытался, но не добился успеха.

3

Решение

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 и т. Д. Имеют другой формат, и расширение для этого формата .. Теперь 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). Используйте параметры компоновщика в меню.

3

Другие решения

затмение, Cygwin

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

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

добавить к -lws2_32

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

0

По вопросам рекламы [email protected]