Newsgroup: it.comp.lang.c
Titolo: problemi in compilazione

Quando compilo un file di un progetto che sto realizzando, il DEV-C++
4.9.8.1 mi da questi errori, ma non capisco come posso risolverli:
[Linker error] undefined reference to `htons@4'
[Linker error] undefined reference to `socket@12'
[Linker error] undefined reference to `setsockopt@20'
[Linker error] undefined reference to `setsockopt@20'
[Linker error] undefined reference to `ioctlsocket@12'
[Linker error] undefined reference to `bind@12'
[Linker error] undefined reference to `select@20'
[Linker error] undefined reference to `__WSAFDIsSet@8'
[Linker error] undefined reference to `send@16'
[Linker error] undefined reference to `select@20'
[Linker error] undefined reference to `__WSAFDIsSet@8'
[Linker error] undefined reference to `recv@16'
[Linker error] undefined reference to `closesocket@4'
[Linker error] undefined reference to `setsockopt@20'
[Linker error] undefined reference to `setsockopt@20'
[Linker error] undefined reference to `setsockopt@20'
[Linker error] undefined reference to `ioctlsocket@12'
[Linker error] undefined reference to `setsockopt@20'
[Linker error] undefined reference to `setsockopt@20'
[Linker error] undefined reference to `setsockopt@20'
[Linker error] undefined reference to `setsockopt@20'
[Linker error] undefined reference to `setsockopt@20'
Posso spedire il sorgete a quanti vorranno aiutarmi. Grazie

 Posso spedire il sorgete a quanti vorranno aiutarmi. Grazie
Questo errore significa: stai usando una funzione chiamata pippo, c'e' un
file .h che definisce pippo, ma non trovo da nessuna parte un simbolo
corrispondente (ovvero non trovo nessun riferimento a dove si trova il
codice di pippo).
Questo perche' tutte le funzioni che operano con i socket si trovano in una
libreria a parte, mi pare winsock.dll per la versione 1 (bleach) e un nome
simile per la versione 2 (molto migliore della prima come compabilita' con
i socket BSD).
Da qualche parte nel DEV-C ci dev'essere un opzione per indicare quali altre
librerie vuoi linkare al tuo programma.
-- 
Mox
"Trust the programmer."
"Don't prevent the programmer from doing what needs to be done."
"Keep the language small and simple."
"Provide only one way to do an operation."


L'opzione che devi settare è questa:
Progetto-Opzioni del Progetto-Parametri.
All'interno di linker inserisci la libreria che deve essere linkata
staticamente (la sintassi è -l"mylib").
Ciao

 staticamente (la sintassi è -l"mylib").
piu' precisamente non la sta linkando staticamente ... ma gli sta dando la
libreria statica (o finta tale come molte sotto windows) che genera solo gli
entry point per tali funzioni delle dll ...
in specifico lui deve inserire nel progetto la libreria:
-lwsock32 (questa per linkare la libreria winsock 1.1 di win95 e successivi)
o
-lws2_32 (per linkare la libreria winsock 2 di 98 se aggiornato in avanti)
cmq spero tanto che hai usato l'include <windows.h> e non gli header per le
piattaforme bsd ;-) che cmq ci sono sotto il mingw per windows nella dir
system :-p
ah e spero che quando hai installato mingw hai installato anche il supporto
win32api che ti da gli header e le lib per windows ...
ciao

 ha scritto nel messaggio
news:9aK1b.260048$Ny5.7...@twister2.libero.it...

l'ho puntualizzato perche' ci ho gia' sbattuto la testa molte volte sotto
windows ... cioe' il 90% delle librerie (*.a) che ti fornisce mingw sono si
dette statiche ma non ti permettono di lincarsi come tali, perche'
forniscono solo gli entry point ...
cmq per tentare di linkare staticamente un programma ti basta dare al linker
l'opzione "-static" ma ti assicuro che ci ho provato con un sacco di
programmi con SDL, glut, zlib, png e altre 200, ma nessuna di queste si
linca in modo statico in windows :-/
alla fine ti cercano sempre la dll nella cartella dell'exe ... quindi non so
se sono io sfigato che usando GCC 3.2 - 3.2.3 e 3.3.1 non sono mai riuscito
a linkare staticamente tali lib
sotto linux lo stesso gcc pare lavorare in modo diverso ... perche' per
linkare le lib dinamiche linki le versioni .os e per linkarle staticamente
invece le versioni .a (almeno da un pezzo di manuale che mi spiegava lo
static ed il dinamick link trovato nel manuale dell'gcc)
ciao

Non uccidetemi!!!
Intanto vi ringrazio per l'aiuto, perņ avrei un altra domanda (precisando
che negli include < > avevo gią importato winsock2): la libreria wsock32.lib
che devo lincare non la devo "includere" ma passare in fase di compilazione,
esatto? Se si come si fa?
Nel mio codice ho scritto questa roba, č corretto:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <ctype.h>
#include <time.h>
#include <sys/time.h>
#include <sys/timeb.h>
#include <sys/types.h>
#include <errno.h>
#include <signal.h>
#include <string.h>
#ifndef LINUX
#else            //qui non so se devo scrivere qualcosa in particolare o lo
stesso che ho messo in UNIX
#endif
#ifndef __SOCKET_H__
 #define __SOCKET_H__
 #ifdef UNIX_POSIX
  #define closesocket close
 #else
  #define close closesocket
 #endif
 #if !defined(UNIX_POSIX) && !defined(WIN32)
  #error Definire UNIX_POSIX oppure WIN32
 #endif
 #ifndef UNIX_POSIX
 typedef int socklen_t;
 #else
 typedef void *HANDLE;
 #endif
 #if defined(UNIX_POSIX)
  typedef long int SOCKET;
  #include <sys/socket.h>
  #include <sys/ioctl.h>
  #include <netinet/in.h>
  #include <netinet/tcp.h>
  #include <arpa/inet.h>
  #include <netdb.h>
  #include <unistd.h>
  #include <pthread.h>
  #include <fcntl.h>
  #define TIMEVAL struct timeval
  #define INVALID_SOCKET  -1
  #define SOCKET_ERROR    -1
  #ifndef FSYNC
   #define FSYNC O_SYNC
  #endif
  #ifndef FASYNC
   #define FASYNC O_ASYNC
  #endif
  #define stricmp strcasecmp
  #define _ftime ftime
  static int WSAGetLastError()
  {
    return errno;
  }
  static void WSASetLastError(int iErr)
  {
    errno = iErr;
  }
  #define WSAEFAULT  EFAULT
  #define WSAENETDOWN  ENETDOWN
  #define WSAEINVAL  EINVAL
  #define WSAEINTR  EINTR
  #define WSAEINPROGRESS  EINPROGRESS
  #define WSAEWOULDBLOCK  EINPROGRESS
  #define WSAENOTSOCK     ENOTSOCK
 #else //defined  WIN32
  #include <winsock2.h>
  #include <windows.h>
  #include <commctrl.h>
 #endif
#endif //__SOCKET_H__

 Nel mio codice ho scritto questa roba, č corretto:
che compilatore stai usando ???
cmq non includere direttamente l'header del winsock, perche' in automatico
l'header windows.h ci pensa gia' lui ad inserire il giusto header winsock in
base alla versione di windows per cui compili ...
nel caso dei windows recenti, dopo il 98 devi linkare la libreria ws2_32 (se
invece compili per win 95 o prime versioni del 98 usi la winsock 1 che si
chiama wsock32)
non ho guardato molto approfonditamente il sorgente che hai postato, ma mi
da un'impressione che hai fatto solo un grande casino in include mischiando
header POSIX con quelli UNIX/BSD e WIN ... magari sono header intelligenti e
alla loroinclusione vedono se stai compilando apposta per loro e semmai non
si includono, ma non ci scommetterei ... quindi va rifatta un po' la parte
di inclusioni divisa per architetttura.
cmq non so se anche la commctrl viene gia' inclusa dalla windows (per non
sbagliare cmq tutti gli altri header includili sotto alla windows e non
prima ...)
ciao

 prima ...)
Windows.h dovrebbe includere qualunque cosa. Una doppia inclusione non fa'
male comunque, visto che tutti gli header ben fatti sono protetti in tal
senso. Includere una libreria prima o dopo la windows.h non dovrebbe creare
problemi.


 problemi.
invece per il primo winsock (per il secondo non so) e' sconsigliatissimo
includerlo prima di includere il windows.h quindi sempre meglio includere il
windows.h e lasciare che sela sbrogli lui ... e semmai mancano header
includerli dopo ... ma mai prima di esso ... anche se dovrebbero avere
questo controllo gli header di windows sono quelli piu' casinisti di tutti
... e hanno mietuto un sacco di vittime ai primi programmi sviluppati ;-) se
segui il mio consiglio tagli via gia' tutti i problemi di inclusioni header
windows ...
cmq non ho detto di non includere il file winsock2.h ma di farlo dopo al
windows.h se proprio voleva includerlo sapendo benissimo che gia' l'header
di windows include la giusta versione per la piattaforma per cui si compila.
ciao

 header windows ...
Non so se ci siano problemi nell'ordine di inclusione degli header. Io ho
sempre incluso solo gli header che mi servivano e non ho mai avuto problemi
o avvisaglie contrarie. Poi finiamo OT con la discussione.
Per gli header guarda quali sono fuori dagli #if(n)def e quali dentro. Fuori
ci sono solo gli header standard, dentro quelli che dipendono dal sistema
sottostante.


Esatto Mox (e grazie per il complimento), fuori dagli if ho lasciato gli
include che andavano messi comunque, però la mia domanda era un'altra, la
libreria ws2_32 devo inserirla come parametro durante la compilazione o va
messa in un include? Dopo non vi disturberò più. Grazie per l'attenzione


Devi includerla nel progetto a tempo di compilazione perchč non si tratta di
una vera č propria libreria, quanto piů di una mappa dei simboli e delle
relazioni con le vere librerie ".dll"
Ciao
--------------------------------
Inviato via 
http://usenet.libero.it

Grazie!