Conflit librairie Erreur à la compilation

KurpeusLondon Messages postés 11 Date d'inscription lundi 5 janvier 2009 Statut Membre Dernière intervention 12 janvier 2009 - 8 janv. 2009 à 18:56
KurpeusLondon Messages postés 11 Date d'inscription lundi 5 janvier 2009 Statut Membre Dernière intervention 12 janvier 2009 - 12 janv. 2009 à 15:02
Bonsoir,

J'utilise Visual C++ express 2008 pour un petit prog que je suis en train de développer. Pour cela, j'utilise les librairies ci dessous :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <fcntl.h>
#include <sys/types.h>
#include "crc.h"
#include "sendUdpTrap.c"

J'utilise de plus une librairie trouvé dans la section "tutoriaux" qui utilise 

#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")

J'ai vu qu'il fallait que j'incluse winsock2 avant windows.h. J'ai donc déplacé les include du tutorial que j'ai placé dans mon fichier principal, en tête de fichier. Cependant maintenant j'obtient des erreurs suivantes

c:\documents and settings\potierj\my documents\visual studio 2008\projects\ati100info\ati100info\sendudptrap.c(12) : error C2275: 'SOCKET' : illegal use of this type as an expression
1>        c:\program files\microsoft sdks\windows\v6.0a\include\winsock2.h(118) : see declaration of 'SOCKET'
1>c:\documents and settings\potierj\my documents\visual studio 2008\projects\ati100info\ati100info\sendudptrap.c(12) : error C2146: syntax error : missing ';' before identifier 'sock'
1>c:\documents and settings\potierj\my documents\visual studio 2008\projects\ati100info\ati100info\sendudptrap.c(12) : error C2065: 'sock' : undeclared identifier
1>c:\documents and settings\potierj\my documents\visual studio 2008\projects\ati100info\ati100info\sendudptrap.c(13) : error C2275: 'SOCKADDR_IN' : illegal use of this type as an expression
1>        c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(588) : see declaration of 'SOCKADDR_IN'
1>c:\documents and settings\potierj\my documents\visual studio 2008\projects\ati100info\ati100info\sendudptrap.c(13) : error C2146: syntax error : missing ';' before identifier 'sin'
1>c:\documents and settings\potierj\my documents\visual studio 2008\projects\ati100info\ati100info\sendudptrap.c(13) : error C2065: 'sin' : undeclared identifier
1>c:\documents and settings\potierj\my documents\visual studio 2008\projects\ati100info\ati100info\sendudptrap.c(15) : error C2143: syntax error : missing ';' before 'type'
1>c:\documents and settings\potierj\my documents\visual studio 2008\projects\ati100info\ati100info\sendudptrap.c(16) : error C2143: syntax error : missing ';' before 'type'
1>c:\documents and settings\potierj\my documents\visual studio 2008\projects\ati100info\ati100info\sendudptrap.c(18) : error C2065: 'ip' : undeclared identifier
1>c:\documents and settings\potierj\my documents\visual studio 2008\projects\ati100info\ati100info\sendudptrap.c(18) : warning C4047: 'function' : 'const char *' differs in levels of indirection from 'int'
1>c:\documents and settings\potierj\my documents\visual studio 2008\projects\ati100info\ati100info\sendudptrap.c(18) : warning C4024: 'sprintf' : different types for formal and actual

Si j'essaye de compiler le fichier seul, il marche très bien, donc je pense que c'est un problème de librairies ou des options dans les bas fond du compilateurs que je ne connais pas.

Merci

6 réponses

uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011
8 janv. 2009 à 19:13
Salut,
Déjà, la seule librairie (et encore, on dit bibliothèque) que tu site est ws2_32.lib, les autres fichiers ne sont que des headers.
L'ordre de leur inclusion n'a pas d'importance :
#include <windows.h>
#include <winsock2.h>
est équivalent à :
#include <winsock2.h>
#include <windows.h>
(du moins, de ce que je connais, puis chez moi ça marchait niquel).
Quant au #pragma comment(lib,"ws2_32.lib"), il ne fonctionen que sous Visual C++, sous Dev C++ (comme sous Codes::Blocks) il faut paramétrer manuellement le linker.
Là je dis peut-être une connerie, mais je tenterais de rajouter -lws2_32 aux options du linker (-l + nom_de_la_lib mais je ne suis pas du tout sûr).
Essaye déjà ça.

Cordialement, uaip.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
8 janv. 2009 à 21:41
#include <winsock2.h>
#include <windows.h>
#pragma comment(lib, "ws2_32.lib")

Un des très rares cas où l'ordre d'inclusion est important.

ciao...
BruNews, MVP VC++
0
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011
8 janv. 2009 à 21:52
Ah merde ^^ d'accord je saurais.
Pourtant, comme à chaque fois, j'ai vérifié avant de poster le commentaire, sur le net j'ai trouvé plusieurs problèmes identiques où certains expliquaient aussi que la directive #pragma ne fonctionnait que sous Visual. Et j'ai regardé une de mes sources, windows.h est inclus avant winsock2.h (mais aucun #pragma, les paramètres du linker se font via une boite de dialogue). C'est peut-être ça qui change, je ne sais pas.

Cordialement, uaip.
0
KurpeusLondon Messages postés 11 Date d'inscription lundi 5 janvier 2009 Statut Membre Dernière intervention 12 janvier 2009
12 janv. 2009 à 13:22
J'ai placé les header dans l'ordre ci dessus, mais j'arrive toujours pas a compiler correctement. Quelqu'un pourrait etre pourrait en dire un peu plus par rapport aux possibles options du linker  cité par uaip ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
KurpeusLondon Messages postés 11 Date d'inscription lundi 5 janvier 2009 Statut Membre Dernière intervention 12 janvier 2009
12 janv. 2009 à 13:59
Ce que je ne comprends pas c'est que si je compile seul le fichier et que je lui ajoute les mêmes includes, je n'ai pas de problème. Dès que je l'ajoute a mon projet, cela ne marche plus...
0
KurpeusLondon Messages postés 11 Date d'inscription lundi 5 janvier 2009 Statut Membre Dernière intervention 12 janvier 2009
12 janv. 2009 à 15:02
A tout hasard, je post mon code :
====================== Main File =======================

#include <winsock2.h>
#include <windows.h>
#pragma comment(lib,"ws2_32.lib")

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include "crc.h"
#include "sendUdpTrap.c"
/*  Définition de constantes*/
#define RX_SIZE         1024    /* taille tampon d'entrée  */
#define TX_SIZE         1024    /* taille tampon de sortie */
#define MAX_WAIT_READ   5000    /* temps max d'attente pour lecture (en ms) */

const char * readOnly = "r";
const char * writeOnly = "w";
const char * readWrite = "a+";

int portCom = 8;
/*  Variables globales.*/

/* Handle du port COM ouvert */
HANDLE g_hCOM = NULL;

/* Délais d'attente sur le port COM */
COMMTIMEOUTS g_cto =
{
    -1,  /* ReadIntervalTimeOut          */
    0,              /* ReadTotalTimeOutMultiplier   */
    50,  /* ReadTotalTimeOutConstant     */
    5,              /* WriteTotalTimeOutMultiplier  */
    50               /* WriteTotalTimeOutConstant    */
};

/* Configuration du port COM */
DCB g_dcb =
{
    sizeof(DCB),        /* DCBlength            */
    9600,               /* BaudRate             */
    TRUE,               /* fBinary              */
    FALSE,              /* fParity              */
    FALSE,              /* fOutxCtsFlow         */
    FALSE,              /* fOutxDsrFlow         */
    DTR_CONTROL_ENABLE, /* fDtrControl          */
    FALSE,              /* fDsrSensitivity      */
    FALSE,              /* fTXContinueOnXoff    */
    FALSE,              /* fOutX                */
    FALSE,              /* fInX                 */
    FALSE,              /* fErrorChar           */
    FALSE,              /* fNull                */
    RTS_CONTROL_ENABLE , /* fRtsControl          */
    FALSE,              /* fAbortOnError        */
    0,                  /* fDummy2              */
    0,                  /* wReserved            */
    28672,              /* XonLim               */
    7168,              /* XoffLim              */
    8,                  /* ByteSize             */
    NOPARITY,           /* Parity               */
    ONESTOPBIT,         /* StopBits             */
    0x11,               /* XonChar              */
    0x13,               /* XoffChar             */
    '?',                /* ErrorChar            */
    0x1A,               /* EofChar              */
    0x10                /* EvtChar              */
};
/*  Fonctions du module.*/
BOOL OpenCOM    (int nId);
BOOL CloseCOM   ();
BOOL ReadCOM    (void* buffer, int nBytesToRead, int* pBytesRead);
BOOL WriteCOM   (void* buffer, int nBytesToWrite, int* pBytesWritten);
void initCom (int BaudRate, int fRtsControle, int ByteSize, int Parity,
              int StopsBits, char XonChar, char XoffChar, char ErrorChar,
              char EovChar, char EvtChar);
unsigned char * CRC16 ( unsigned  char puchMsg, unsigned short usDataLen );
void freeMem(struct sTop * pTop);
void initStruct(struct sTop* pTop);
int sendTrap(char * pBufferOut);

struct sTop{
    struct sData * u12Main;
    struct sData * u23Main;
    struct sData * u31Main;
    struct sData * v1Main;
    struct sData * v2Main;
    struct sData * v3Main;
    struct sData * freqMain;
    struct sData * u12Gen;
    struct sData * u23Gen;
    struct sData * u31Gen;
    struct sData * v1Gen;
    struct sData * v2Gen;
    struct sData * v3Gen;
    struct sData * freqGen;
};

struct sData{
    char * label;
    unsigned int value;
    char frame[9]; /* Modbus communication use addr "0" to broadcast and 1 to 247 to address a node. 248 to 255 are reserved addresses. To be convert in Hex */
                  /* According to the ATI100 transfer panel, broadcast adresse only usable for writing functions (6 and 16). */
                /* ModBus define two function to compute the CRC : RTU and ASCII. ATI100 use RTU */
};

char tableHex[14] = { 0x08, 0x0A, 0x0C, 0x0E, 0x10, 0x12, 0x14, 0x70, 0x72, 0x74, 0x76, 0x78, 0x7A, 0x7C};
char tableLabel[14][9]= {"u12Main","u23Main","u31Main","v1Main","v2Main","v3Main","freqMain","u12Gen","u23Gen","u31Gen","v1Gen", "v2Gen","v3Gen","freqGen"};

struct sData * createStruct(unsigned int code, char * label);

int main()
{

        /* variables locales */
    char bufferIn[16];
//    char * pBufferIn;

    int idReq = 14, nBytesWritten, nBytesRead;
    int * pItemOut = NULL;
    int * pItemIn = NULL;
    int crcError = 1;
    unsigned int valueItem;

(......)

====================== File sendUdpTrap==================

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

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

int sendTrap(char * pBufferOut)
{
   
    WSADATA wsa;
    WSAStartup(MAKEWORD(2,0),&wsa);

    SOCKET sock;
    SOCKADDR_IN sin;

    char ip[15];
    int port;

    sprintf("%s",ip, "192.168.100.20");
    port = 162;

    sin.sin_family=AF_INET;
    sin.sin_addr.s_addr=inet_addr(ip);
    sin.sin_port=htons(port);

    sock=socket(AF_INET,SOCK_DGRAM,0);//On initialise le socket avec SOCK_DGRAM pour dire qu'on est en UDP
    bind(sock,(SOCKADDR*)&sin,sizeof(sin));

        memset(pBufferOut,0,sizeof(pBufferOut));

        sendto(sock,pBufferOut,sizeof(pBufferOut),0,(SOCKADDR*)&sin,sizeof(sin));
        //sendto envoie des packets udp, ses parametres :
        // 1 : le socket avec lequel on envoie
        // 2 : la chaine a envoyer
        // 3 : la taille de cette chaine
        // 4 : ??? chais po
        // 5 : les parametre (convertis en structure SOCKADDR
        // 6 : la taille de la structure SOCKADDR_IN

return 0;
}
0
Rejoignez-nous