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.
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
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. –
Weiß jemand, ob es in Visual Studio etwas wie iquote gibt (cl.exe flag?) –