Ошибка компоновщика MinGW: winsock

Я использую компилятор MinGW в Windows для компиляции моего приложения C++ с сокетами. Моя команда для связывания выглядит так:

g++.exe -Wall -Wno-long-long -pedantic -lwsock32 -o dist/Windows/piskvorky { there are a lot of object files }

и я тоже пробовал

g++.exe -Wall -Wno-long-long -pedantic -lws2_32 -o dist/Windows/piskvorky { there are a lot of object files }

но в обоих случаях я получаю эту ошибку:

build/Windows/MinGW-Windows/src/utils/tcpunit.o:tcpunit.cpp:(.text+0x33): undefined reference to `closesocket@4'
build/Windows/MinGW-Windows/src/utils/tcpunit.o:tcpunit.cpp:(.text+0xd0): undefined reference to `send@16'
build/Windows/MinGW-Windows/src/utils/tcpunit.o:tcpunit.cpp:(.text+0x1ee): undefined reference to `recv@16'
build/Windows/MinGW-Windows/src/utils/tcpdevice.o:tcpdevice.cpp:(.text+0x184): undefined reference to `WSAStartup@8'
build/Windows/MinGW-Windows/src/utils/tcpdevice.o:tcpdevice.cpp:(.text+0x1a5): undefined reference to `closesocket@4'
build/Windows/MinGW-Windows/src/utils/tcpdevice.o:tcpdevice.cpp:(.text+0x1cb): undefined reference to `closesocket@4'
build/Windows/MinGW-Windows/src/utils/tcpdevice.o:tcpdevice.cpp:(.text+0x1d3): undefined reference to `WSACleanup@0'
build/Windows/MinGW-Windows/src/utils/tcpdevice.o:tcpdevice.cpp:(.text+0x6fe): undefined reference to `bind@12'
build/Windows/MinGW-Windows/src/utils/tcpdevice.o:tcpdevice.cpp:(.text+0x724): undefined reference to `listen@8'
build/Windows/MinGW-Windows/src/utils/tcpdevice.o:tcpdevice.cpp:(.text+0x7f0): undefined reference to `gethostbyaddr@12'
build/Windows/MinGW-Windows/src/utils/tcpdevice.o:tcpdevice.cpp:(.text+0x83c): undefined reference to `socket@12'
build/Windows/MinGW-Windows/src/utils/tcpdevice.o:tcpdevice.cpp:(.text+0x86f): undefined reference to `htons@4'
build/Windows/MinGW-Windows/src/utils/tcpdevice.o:tcpdevice.cpp:(.text+0x8b5): undefined reference to `connect@12'
build/Windows/MinGW-Windows/src/utils/tcpdevice.o:tcpdevice.cpp:(.text+0x9c6): undefined reference to `accept@12'

У вас есть идеи, где может быть проблема, пожалуйста?


person Gaim    schedule 09.01.2010    source источник
comment
piškvorky se socketama? :D   -  person Matouš Vrba    schedule 19.03.2013
comment
@Matous Да, в игре есть сетевой режим   -  person Gaim    schedule 20.03.2013


Ответы (4)


Поместите -lws2_32 ПОСЛЕ списка объектных файлов - GCC ищет библиотеки и объектные файлы в том порядке, в котором они появляются в командной строке.

Просто чтобы помочь другим зрителям:

gcc hello.c -o hello.o -lws2_32
person Community    schedule 09.01.2010

с mingw на eclipse: Меню - Projekt - Свойства - c/c++Build - Настройки: Зарегистрировать "Настройки инструмента" - MinGW C Linker - Разное: Нижняя часть "другие объекты" добавить: "D:\Programmierung\mingw\lib\ libwsock32.a", например. Никаких других записей для libwsock32.a в каких-либо других свойствах не требуется, особенно в записях библиотеки. Также нет флагов, относящихся к этой Lib.

person Kai    schedule 04.05.2015
comment
Ответ на английском... Пути нет, но это не должно быть проблемой. - person jazzpi; 19.09.2016

In:

Меню - Проект - Свойства - c/c++Build - Настройки: Зарегистрировать "Настройки инструмента" - MinGW C++ Linker - Разное: Нижняя часть "другие объекты"

Добавьте: libwsock32.a из папки bin MinGW.

person Anand Paul    schedule 04.10.2017

Привет, я только что решил проблему выше....

Итак, сначала несколько наблюдений....

Я знаю, что вы имеете в виду MinGw, но вам может понадобиться cygwin, чтобы обойти это, я не так хорошо знаю mingw, я знаю cygwin лучше. Но я знаю, что они двоюродные братья друг другу.

Cygwin поставляется с предварительно скомпилированными библиотеками boost, но кто знает, в какой они версии. Я уверен, что это можно проверить, но у кого есть время, чтобы сделать это правильно? Я не связываюсь с библиотеками cygwin boost или библиотеками mingw boost, я создал boost с нуля, используя gcc для Windows (cygwin). Компиляция прошла нормально.

На момент написания этой статьи я полагаю, что Boost находится на версии 1.47.0.

Уже тот факт, что cygwin использует версию (x?) и Boost 1.47.0, может быть серьезной проблемой. Дайте вам знать, что вы используете в качестве повышения.

Я использовал код, разработанный для Boost 1.42, и имел связанные с этим ошибки компоновщика. Код скомпилирован, заголовки найдены и т. д. и т. д., но затем я получил неопределенную ссылку на WSA и т. д. и т. д., открываю этот сокет, закрываю тот и т. д.

Так вот, очевидно boost, чтобы делать сетевые сокеты, требует платформенную библиотеку, в которой нашлась в виде ws2_32 для windows, и сокета для linux точно.

Поэтому, если вы правильно используете boost и включаете правильные системные библиотеки boost, вам также может понадобиться библиотека для конкретной ОС для доступа к некоторым ресурсам (в данном случае к сети).

После этого ошибки компоновщика исчезают. Вероятно, для ветеранов очевидно, что здесь происходит, но я не смог найти внятного ответа через google.

person Joe R.    schedule 08.09.2011