web-dev-qa-db-fra.com

C - Référence non définie à WSAStartup @ 8 '

J'utilise Code :: Blocks, MinGW et Windows. Im essayant d'initialiser le winsock afin que je puisse travailler sur un projet. Je reçois toujours l'erreur Undefined Reference to WSAStartup@8 Quelqu'un sait comment résoudre ce problème?

#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>

#pragma comment(lib,"ws2_32.lib")

int main(int argc , char *argv[]){
    WSADATA wsa;
    int output;

    output=WSAStartup(MAKEWORD(2,2),&wsa);
    if(output != 0) {
        printf("Startup failed %d\n", output);
        return 1;
    } else {
        printf("Initialized");
        return 0;
    }

}
11
Paulo

L'éditeur de liens recherche les dépendances après le chargement du code. Si la bibliothèque est apparue dans le processus de construction avant que les symboles ne soient nécessaires, car les fichiers source sont apparus après cela, aucun symbole n'a été utilisé et plus tard, lorsqu'ils apparaîtront dans les fichiers source, ils ne seront pas résolus. Placez la bibliothèque winsock -lws2_32 que vous liez avec APRÈS les fichiers source et objet.

gcc prog.c -o prog -lws2_32
20
4pie0

J'ai fait un autre chemin, je trouve la bibliothèque qui contient des fonctions auxquelles le compilateur ne peut pas se lier, puis j'ajoute à l'éditeur de liens du compilateur. et presque des bibliothèques se trouvent dans le dossier lib de MINGW (souvent C:/MinGW/lib); comme ceci Ce sont des bibliothèques que j'ajoute quand j'ai eu quelques erreurs avec Dlib Ou vous pouvez faire cette instruction pour la lib manquante de regconite automatique. Construction d'un programme wxWidgets dans Code :: Blocks

1
Kien.VietNam

Votre code source montre que vous utilisez l'instruction très spécifique, (au compilateur de Microsoft), #pragma comment(lib,"ws2_32.lib"). Il y a deux problèmes avec ceci:

  1. Ce pragma n'est pas valide dans GCC, (c'est-à-dire les compilateurs MinGW), il est donc simplement ignoré, à la fois lors de la compilation et de la liaison.
  2. Dans MinGW, (en commun avec la convention GCC sur la plupart (peut-être toutes?) D'autres plates-formes), il n'y a pas de "ws2_32.lib"; le nom correct pour la bibliothèque (qui est une bibliothèque d'importation pour ws2_32.dll) est "libws2_32.a".

Pour résoudre votre problème, vous ne devez pas compter sur des pragmas spécifiques à MSVC, dans votre code source; vous devez plutôt spécifier la bibliothèque correctement sur la ligne de commande de liaison, (presque) comme le montre tinky_Winky:

gcc prog.c -o prog.exe [...other .c and .o files...] -lws2_32 ...

(et assurez-vous que toutes les bibliothèques que vous spécifiez proviennent après les fichiers objet ou les fichiers source qui en ont besoin).

1
Keith Marshall

Vous devriez peut-être vérifier votre compiler options, ajouter -lws2_32 à add linker options when linking. J'utilise TDM-GCC, ça marche bien après ça.

0
Runker Hamming