2012-03-27 5 views
2

Ich habe eine Datei im Quellbaum, deren Name "time.h" ist, genau wie das System "time.h". Dies kann nicht geändert werden. Ich habe ein Problem mit cmake festgestellt, dass, wenn ich die include_library-Option verwende, es in -I-Flag übersetzt wird, was bedeutet, dass mein benutzerdefiniertes "time.h" die Systemzeit time.h selbst für <> übernimmt. Dies ist ein definiti no-no.cmake include_directories Reihenfolge nach/vor

Ich habe versucht mit include_directories (AFTER dir1 dir2), aber es immer noch generieren -I Option statt erwartet -idirafter.

Antwort

3

Ich denke nicht, dass dies ein Problem mit CMake ist; Ich glaube, gcc wird immer Ihre "time.h" vor dem System finden, unabhängig davon, ob Sie Anführungszeichen oder Klammern in #include und unabhängig von den verschiedenen Optionen in include_directories verwenden. Siehe die Einträge für -I und -isystem im gcc documentation

Die AFTER Option von CMake des include_directories bezieht sich nur auf die Reihenfolge der Verzeichnisse wie im gcc-Befehl aufgeführt ist, verhält sie sich nicht auf -idirafter Flagge gcc.

Es ist kein großer Plan, Ihre eigenen Dateien mit identischen Namen zu Systemdateien zu haben, aber wenn Ihre Hände gebunden sind, könnten Sie dieses Problem vermeiden, ohne Zeit umzubenennen.h durch Qualifizierung des Pfades für Ihre eigenen enthält mehr vollständig eher als zB

CMakeLists.txt: include_directories(${PROJECT_SOURCE_DIR}/src) 

header file:  #include <time.h> // we want but don't get system one 
       #include "time.h" // we want and get own custom one 

etwas mehr wie

CMakeLists.txt: include_directories(${PROJECT_SOURCE_DIR}) 

header file:  #include <time.h>  // we want and get system one 
       #include "src/time.h" // we want and get own custom one 


Eine alternative Option mit Ihrem aktuellen #include Setup zu halten wäre (Winkel Klammer für das System time.h und Angebote für Ihre eigenen) und nicht verwenden include_directories überhaupt in der CMakeLists.txt. Stattdessen denke ich, es mit so etwas wie ersetzen könnte:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -iquote ${PROJECT_SOURCE_DIR}/src") 

Mit -iquote ist wahrscheinlich eine bessere Option als -idirafter da das Verzeichnis von -idirafter ist (in diesem Fall falsch) als Systemverzeichnis behandelt angegeben, und als solche hat Warnungen unterdrückt usw.

Wenn Sie für diese Wahl gehen Sie, ist es wahrscheinlich lohnt sich die CMakeLists.txt kommentieren zu erklären, warum nicht ist es include_directories zurück, um den normaleren include_directories Befehl zurückkehrt Zukunft Refactoring zu vermeiden, zu verwenden.

Alles in allem wäre Ihre beste Option, wenn möglich, Ihre "time.h" Datei umzubenennen.

+0

Vielen Dank für die vollständige Antwort. Die erste Option ist nicht gut für mich, da das Problem nicht bei meinen Dateien liegt, sondern bei Systemdateien wie "sched.h", die versehentlich meine Datei anstelle von System eins enthalten. Wahrscheinlich werde ich explizite Compileroptionen anstelle von include_directories verwenden. – Boris

+0

Ich kam zu dieser Frage, weil ich versehentlich eine leere lokale Datei namens "new" in meinem Include-Suchpfad erstellt hatte. Dies hat den Systemheader vorweggenommen, in dem mehrere #include-Ebenen von einer Bibliothek verwendet wurden, die ich verwende. Ich verbrachte Stunden damit herauszufinden, warum (Nachricht war ** Fehler: 'Nothrow' ist kein Mitglied von 'Std' ** gefolgt von einem Compiler-Absturz). Es scheint, als ob ich den Mechanismus -iquot verwenden kann (gibt es ein Visual Studio-Äquivalent?), Um sicherzustellen, dass Dateien, die über spitze Klammern eingeschlossen sind, nur aus System-Headern stammen; es wäre schön, wenn dies über einen CMake-Befehl unterstützt würde. –

+1

Weiß jemand, ob es in Visual Studio etwas wie iquote gibt (cl.exe flag?) –