Newsgroup: it.comp.lang.c++
Titolo: Compilazione con GCC di un frullato

Salve!
Devo necessariamente compilare una roba col compilatore GCC. Si tratta
di una ventina di file .c più un file .cpp
Prima li compiliamo creando i corrispondenti file .o
Poi li mettiamo nel frullatore e tentiamo di linkarli per creare
l'eseguibile al gusto di frutta.
Ogni file .c chiama funzioni definite in un diverso file .c e quindi
compilate in un altro file .o dal quale le importa.
Questo funziona finché non chiamo le funzioni definite nel file .cpp
(che viene trattato come tutti gli altri, solo che è in C++).
L'errore del compilatore è del tipo:
srvrsmtp.o: In function 'smtp'
srvrsmtp.o(.text+0x365): Undefined reference to 'EstraiIP'
srvrsmtp.o(.text+0x397): Undefined reference to 'DeComando'
Come devo fare per fargli trovare 'ste benedette funzioni???

 Come devo fare per fargli trovare 'ste benedette funzioni???
includere i .h?



ok... i file .h ci sono sempre stati , nonostante ciň si ostina a non
linkare.....
Qualche altra idea?
10X

 (che viene trattato come tutti gli altri, solo che è in C++).
Devi dichiarare le funzioni nel file cpp extern "C",altrimenti il linker
generera' i simboli nella nomencaltura standard c++,e non verranno
risolti.
--
Ivan Molella
__LINUX__ the choice of the  __GNU__ generation

 linkare.....
// file.cpp
extern "C" {
  #include "file.h"
} 
Ciao Anto
-- 
Antonio Cuni, 19 anni, studente
Brainbench C++ Master: 4.6, higher than 98% of all previous test takers.
C Language: 3.32, higher than 79% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it

 } 
Molto comune e' invece usare degli header che funzionino
sia per C che per C++ usando questo sistema
  // file.h
  #if defined(__cplusplus)
  extern "C" {
  #endif
  ...
  #if defined(__cplusplus)
  }
  #endif
La macro __cplusplus su molti compilatori C/C++ e' definita
automaticamente solo quando si sta compilando in modalita' C++.
Andrea

 automaticamente solo quando si sta compilando in modalita' C++.
potrei sbagliarmi, ma credo che questa macro sia adirittura prevista dallo 
standard, quindi la tua soluzione sarebbe anche assolutamente portabile.


standard, quindi la tua soluzione sarebbe anche assolutamente portabile.
Non credo che lo standard possa richiedere che quella macro sia
definita *solo* quando si compila C++ (sarebbe mettere dei vincoli
sui compilatori "C" ... e questo e' lavoro per un altro comitato).
Non possiedo pero' nemmeno un draft dello standard "C" e quindi
no so se anche in quel documento si parla di "__cplusplus".
Si tratta comunque di un sistema molto portabile e molto usato
(anche credo di aver letto qualcosa su problemi delle macro
__STDC__ e __cplusplus con alcuni compilatori).
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff

 sui compilatori "C" ... e questo e' lavoro per un altro comitato).
In 16.8.1 si specifica che devono essere definite le seguenti
preprocessor macros: __LINE__, __FILE__, __DATE__, __TIME__ e
__cplusplus; inoltre __STDC__  puo' essere definito (e questo e'
implementation dependent).  In particolare dice:
"The name __cplusplus is defined to the value 199711L when compiling a
C++ translation unit [compliant con ISO-IEC 14882:1998]".
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Univ. of Padova, Dept. of Physics - Padova, Italy            
lor...@pd.infn.it

C++ translation unit [compliant con ISO-IEC 14882:1998]".
Credo di non essere stato sufficientemente chiaro sul perche'
quella macro non permette la portabilita' assoluta...
Chi impedisce ad un compilatore -->C<-- di definire __cplusplus ?
Se lo standard del linguaggio "C" non lo vieta un compilatore
conforme "C" potrebbe definire __cplusplus al valore "NO" ...
oppure (giusto per cattiveria) al valore 199711L.
Se pero' questo succedere i file di include "C/C++" non
funzionerebbero ... perche' dire
     extern "C" { 
e' un errore di sintassi in C.
Dico semplicemente che non si puo' dire nulla riguardo a file
di include "C/C++" portabili a meno che sia lo standard C che
lo standard C++ si siano allineati su questo punto.
Io non sono affatto sicuro che questo sia il caso (pero' non
possiedo nessun documento di specifiche del C standard).
