Я использую 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]
кнопка) У меня всегда есть эта ошибка undefined reference to '_WSAStartup@8'
,
Я уже перепробовал все, что мог найти на форумах NB. Я пытался связать libws2_32.a
к моему проекту таким образом. Я иду в:
File -> Project Properties -> Linker -> Libraries
И есть три варианта:
Я перепробовал их все. Я пытался связать только библиотеку и библиотечный файл. Я также пытался
добавить такую опцию в Add Option...
кнопка:
Add Option... -> Other option -> // and I input here "-lws2_32"
Но что бы я ни делал, я не могу запустить проект из NB, я получаю ошибку undefined reference to '_WSAStartup@8'
,
Итак, мои вопросы:
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
файлы? Я пытался, но не добился успеха.
UPD:
Ответ на 3-й вопрос -> #pragma comment (lib, "xxx.lib") эквивалентен под Linux?
Мне кажется, что вы добавили -lws2_32
переключиться на параметры компилятора C / C ++. Когда netbeans вызывает компилятор, он передает -c
переключатель, и он будет игнорировать параметры компоновщика, такие как -l
, В разделе параметров компоновщика у Netbeans есть подходящее место для добавления внешних библиотек. Или вы можете добавить -l
в качестве дополнительной опции для компоновщика. Это может решить проблему.
*.lib
файлы используются набором инструментов Microsoft (cl.exe) и lib*.a
используются GNU toolchain (это часть adivse, которую вы нашли). Если вы собираетесь использовать Cygwin, вам понадобится lib*.a
файлы. В этом контексте наличие Microsoft SDK вам совсем не поможет. Кроме того, если вам нужен файл, который существует только в .lib format, you can convert to
.a` с помощью инструмента под названием РПУЭИ.
Надеюсь это поможет.
У меня была эта проблема 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 & Символы
Это связывает libws2_32.a с моим проектом, и теперь он работает нормально.
Я попытался использовать Windows ws2_32.dll и ws2_32.lib и не получил ничего, кроме боли.