59 votes

Erreur du lien MinGW: winsock

Je suis en train d'utiliser le compilateur MinGW sur Windows pour compiler mon application C++ avec des sockets. Ma commande de liaison ressemble à ceci:

g++.exe -Wall -Wno-long-long -pedantic -lwsock32 -o dist/Windows/piskvorky { il y a beaucoup de fichiers objets }

et j'ai aussi essayé

g++.exe -Wall -Wno-long-long -pedantic -lws2_32 -o dist/Windows/piskvorky { il y a beaucoup de fichiers objets }

mais dans les deux cas, j'obtiens cette erreur:

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

Avez-vous une idée d'où pourrait se trouver le problème, s'il vous plaît?

147voto

Place the -lws2_32 APRÈS la liste des fichiers objets - GCC recherche les bibliothèques et les fichiers objets dans l'ordre où ils apparaissent sur la ligne de commande.

Juste pour aider les autres spectateurs là-bas :

gcc hello.c -o hello.o -lws2_32

10voto

Kai Points 97

Avec MinGW sur eclipse :

Menu >> Projet >> Propriétés >> C/C++ Build >> Paramètres : Enregistrer "Tool Settings" - MinGW C Linker - Divers : Partie inférieure "autres objets"

Ajouter : "D:\Programmierung\mingw\lib\libwsock32.a" par exemple. Aucune autre entrée pour libwsock32.a dans aucune autre propriété n'est requise, notamment pas dans les entrées de bibliothèque. Pas non plus de drapeaux liés à cette bibliothèque.

1voto

Anand Paul Points 198

Dans:

Menu - Projet - Propriétés - c/c++Build - Paramètres: Inscrire "Paramètres d'outil" - MinGW C++ Linker - Divers: Partie inférieure "autres objets"

Ajouter: libwsock32.a du dossier bin de MinGW.

0voto

stakx Points 29832

Quelques choses à vérifier :

  • Est-ce que MinGW trouve réellement la bibliothèque winsock ? (Il semble que oui, car il n'y a pas d'erreur explicite indiquant le contraire.) Si ce n'est pas le cas, essayez de fournir un chemin de recherche de bibliothèque supplémentaire en utilisant -L.

  • Avez-vous compilé vous-même la source de la bibliothèque winsock, également avec MinGW ? Si la réponse est "non", et que le code source est disponible, c'est ce que vous devrez peut-être faire, afin que MinGW reconnaisse les symboles exportés dans le fichier objet de la bibliothèque.

-3voto

Joe R. Points 11

Salutations, je viens de passer en revue le problème ci-dessus....

Voici donc quelques observations tout d'abord....

Je sais que vous faites référence à MinGW, mais vous pouvez avoir besoin de cygwin pour contourner cela, je ne connais pas très bien mingw, je connais mieux cygwin. Mais je sais qu'ils sont des cousins l'un de l'autre.

Cygwin est livré avec les bibliothèques boost précompilées, mais qui sait de quelle version il s'agit. Je suis sûr qu'il est possible de vérifier, mais qui a le temps de le faire, n'est-ce pas? Je ne lie pas contre les bibliothèques boost de cygwin, ni les bibliothèques boost de mingw, j'ai construit boost à partir de zéro en utilisant gcc sur windows (cygwin). La compilation s'est bien passée.

Au moment où j'écris ceci, boost est à la version 1.47.0 je crois.

Déjà le fait que cygwin utilise la version (x?) et que boost est à 1.47.0 pourrait être un problème majeur. Assurez-vous de bien savoir ce que vous utilisez en matière de boost.

J'utilisais du code développé sur boost 1.42, et avais des erreurs de liaison connexes. Le code compilait, les en-têtes étaient trouvées, etc..etc... mais ensuite j'ai obtenu les références non définies à WSA etc...etc...opensoket ceci, closesocket cela, etc....

Ainsi, apparemment boost, pour effectuer des sockets réseau, nécessite une bibliothèque de plate-forme, qui a été trouvée sous forme de ws2_32 pour Windows, et de socket pour Linux, c'est sûr.

Donc, si vous utilisez correctement boost, et incluez les bonnes bibliothèques système boost, vous pourriez également avoir besoin d'une bibliothèque spécifique au système d'exploitation pour accéder à certaines ressources (réseau dans ce cas).

Les erreurs de liaison disparaissent ensuite. Il est probablement évident pour les vétérans de boost ce qui se passe ici, mais je n'ai pas pu trouver de réponse claire via Google.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X