2010-03-01 7 views
5

E 'solo per testare compilare un semplice programma, con quel file di intestazione # incluso?Il modo migliore per verificare in modo programmatico l'esistenza del file di intestazione?

Per comprendere meglio il processo di compilazione sto scrivendo il mio "configure", che verifica l'esistenza di alcuni file di intestazione e libreria.

+0

Si ha il nome del file e l'elenco delle directory di inclusione. Perché non controllare solo se il file si trova in una di queste? –

+1

@Nikolai: uno dei motivi per non farlo è che l'intestazione 'headline' potrebbe includere altri file, ed è più difficile verificare se i file da cui è presente siano presenti controllando se sono tutti presenti rispetto a prova la compilation. –

+0

@ Jonathan: lo capisco. Naturalmente dipende totalmente dalla portata del progetto, ma farei una ricerca ricorsiva per le direttive "include". –

risposta

6

Sì, utilizzare il compilatore per compilare il semplice programma di test. Questo è il modo migliore e più semplice per vedere se il compilatore può trovare l'intestazione. Se il tuo codice è #include i percorsi di ricerca, dovrai sempre modificarli e adattarli a diversi compilatori.

+0

concordato; Come osserva Jonathan Leffler, questo è il modo in cui Autoconf lo fa, che è almeno un voto di esperienza ragionevolmente forte a suo favore. –

4

La suite GNU Autoconf controlla le intestazioni eseguendo le compilation di test. Il semplice test per l'esistenza di un file 'filename.h' è abbastanza semplice:

#include <filename.h> 
int main(void){return 0;} 

Potresti preferire virgolette anziché parentesi angolari.

-1

Utilizzando il seguente programma, è possibile trovare l'esistenza del file di intestazione.

#include<stdio.h> 
main() 
{ 
     FILE * file; 
     if ((file = fopen("/usr/include/stdio.h", "r"))!=NULL) 
     { 
       fclose(file); 
       printf("true"); 
     } 
     perror("err"); 

} 
+1

Critica? Risolto il nome per il file che stai cercando. Risolto il percorso per il file che stai cercando. Usando il file che stai cercando durante la compilazione del programma che stai usando per cercarlo. Stato di stampa su stdout quando OK e su stderr quando no. Non restituire stati di uscita diversi per il successo e l'insuccesso. Utilizzando la definizione arcaica di C principale - C99 richiede 'int main()' o 'int main (void)', quindi questo deve essere C89 o codice precedente. Sfortunatamente, solo C99 garantisce uno stato di uscita zero da main() quando non si inserisce un ritorno esplicito, quindi lo stato di uscita non è definito. –

+0

Questo non funzionerà affatto in generale. –

Problemi correlati