2010-03-01 18 views
5

Czy wystarczy przetestować kompilację prostego programu, z dołączonym do niego plikiem nagłówkowym?Najlepszy sposób na programowe sprawdzenie istnienia pliku nagłówkowego?

Aby lepiej zrozumieć proces kompilacji, piszę własny "configure", który testuje istnienie kilku plików nagłówkowych i bibliotecznych.

+0

Masz nazwę pliku i listę katalogów uwzględnianych. Dlaczego nie po prostu sprawdzić, czy plik jest w którymś z nich? –

+1

@Nikolai: Jednym z powodów nie tylko tego, że nagłówek nagłówka może sam zawierać inne pliki, i trudniej jest sprawdzić, czy te pliki, od których zależy, są sprawdzane, czy wszystkie są obecne, czy nie spróbuj kompilacji. –

+0

@ Jonathan: Rozumiem to. Oczywiście zależy to całkowicie od zakresu projektu, ale wykonam rekursywne wyszukiwanie dyrektyw "include". –

Odpowiedz

6

Tak, użyj kompilatora, aby skompilować prosty program testowy. To najlepszy i najłatwiejszy sposób sprawdzenia, czy kompilator może znaleźć nagłówek. Jeśli przytoczysz # include ścieżki wyszukiwania, zawsze będziesz musiał zmodyfikować i dostosować się do różnych kompilatorów.

+0

Uzgodnione; Jak zauważa Jonathan Leffler, tak właśnie robi się Autoconf, co jest przynajmniej rozsądnym, silnym doświadczeniem na jego korzyść. –

4

Pakiet GNU Autoconf sprawdza nagłówki, uruchamiając kompilacje testowe. Samo sprawdzenie istnienia pliku "filename.h" jest dość proste:

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

Możesz preferować cytaty zamiast nawiasów ostrych.

-1

Za pomocą poniższego programu można znaleźć istnienie pliku nagłówkowego.

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

} 
+1

Krytyka? Naprawiono nazwę pliku, którego szukasz. Naprawiono lokalizację dla pliku, którego szukasz. Korzystanie z pliku, którego szukasz podczas kompilacji programu, którego używasz do wyszukiwania. Status drukowania na standardowe wyjście, gdy OK i na stderr, gdy nie. Nie zwracanie różnych statusów wyjścia dla sukcesu i porażki. Użycie archaicznej definicji C głównego - C99 wymaga "int main()" lub "int main (void)", więc musi to być kod C89 lub starszy. Niestety, tylko C99 gwarantuje zerowy kod wyjścia z main(), gdy nie wprowadzasz wyraźnego zwrotu, więc status wyjścia jest niezdefiniowany. –

+0

To nie będzie działać w ogóle. –

Powiązane problemy