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