Ошибка компоновщика MinGW: winsock - PullRequest
44 голосов
/ 09 января 2010

Я использую компилятор 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'

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

Ответы [ 4 ]

113 голосов
/ 09 января 2010

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

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

gcc hello.c -o hello.o -lws2_32
7 голосов
/ 05 мая 2015

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

2 голосов
/ 04 октября 2017

В:

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

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

0 голосов
/ 08 сентября 2011

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

Итак, сначала несколько замечаний ...

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

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

На момент написания этой статьи буст на версии 1.47.0, я верю.

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

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

Таким образом, для повышения, для создания сетевых сокетов, требуется библиотека платформы, в которой был найден ws2_32 в форме для Windows, и сокет для Linux.

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

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

...