CMake: Reihenfolge der include-Verzeichnisse (Wie mix-system - und Benutzer-basierte include-Pfade?)
Habe ich ein CMake-Projekt umfasst und links gegen zwei Bibliotheken, sagen A
und B
(eigentlich ist es mehr als zwei und eine von Ihnen ist die boost-Sachen, aber das spielt eigentlich keine Rolle hier). Beide befinden sich über FindSomething.cmake
Skripts, die (richtig) füllen Sie die standard-CMake-Variablen so, dass die include-Verzeichnisse Hinzugefügt werden, die über
INCLUDE_DIRECTORIES(${A_INCLUDE_DIRS})
INCLUDE_DIRECTORIES(${B_INCLUDE_DIRS})
und die Verknüpfung später geschieht über
TARGET_LINK_LIBRARIES(mytarget ${A_LIBRARIES} ${B_LIBRARIES})
Nun, das problem ist, dass beide Bibliotheken können entweder Ihren Wohnsitz in einem durch den Benutzer vor Ort oder in der system-Verzeichnisse (ich bin auf linux durch die Art und Weise, CMake 2.8.2) - oder in beiden. Lassen Sie uns sagen A
ist nur in $HOME/usr/include
und $HOME/usr/lib
während B
(boost in meinem Fall), wohnt in der system-Pfade (/usr/include
und /usr/lib
) UND im Benutzer-basierten Pfade - in verschiedenen Versionen. Die finden Skripts werden können, um zu finden, die entweder das system oder der Benutzer-library B
funktioniert.
Das Problem beginnt, wenn ich verbinden möchte gegen B
aus dem system-Pfade.${B_INCLUDE_DIRS}
und ${B_LIBRARIES}
richtig zeigen Sie auf das system-weiten Standorte der Header und Bibliotheken. Aber es gibt noch ${A_INCLUDE_DIRS}
dass die Punkte auf eine nicht-system-include-Verzeichnis und letztlich auch die Header für die Bibliothek B
stammen aus diesem Ort, während die Verknüpfung für B
verwendet die version aus dem system-Pfade (über ${B_LIBRARIES}
), die zu Konflikten führen, nämlich die Verknüpfung der Fehler.
Ändern der Reihenfolge der INCLUDE_DIRECTORIES
Aussagen nicht scheinen, etwas zu ändern. Ich überprüfte die Herkunft der Symbole führen, dass die Verknüpfung von Fehlern über nm --line-numbers
auf die Objekt-Dateien.
Was kann ich tun? Gibt es einen trick, um
- Kraft, die die Reihenfolge der include-Verzeichnisse (auch wenn dies bedeutet den Vorrang einzuräumen, ein system Weg, obwohl es ist auch ein Benutzer-basierte angegebenen Ort)?
- sagen CMake zu verwenden
${A_INCLUDE_DIRS}
für alle Header ausA
und${B_INCLUDE_DIRS}
für alle Header ausB
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist, was CMake sagt über
include_directories()
:include_directories([AFTER|BEFORE] [- SYSTEM] dir1 [dir2 ...])
Können Sie angeben, dass Sie wollen include-Verzeichnissen gesucht, die vor oder nach der system-include-Verzeichnisse an der Zeit, dass Sie sagen, dass es über diesen Verzeichnissen.
Können Sie auch ein spezielles Ziel:
target_include_directories(Ziel, [SYSTEM] [VOR] [items1...] [ [items2...] ...])
include_directories(BEFORE SYSTEM ${THIRD_LIB}/python3.7.1/include)
unter windows versuchen zu überschreiben, Python ist3.6-Pfad definiert, die im system-PFAD, fanden aber immer noch Python ist3.6-header.Bei der Verwendung von Bibliotheken von Drittanbietern, würde ich immer
Bibliothek A + B-header-Dateien:
third_party/include/libA_name/<-- setzen, header-Dateien in
third_party/include/libB_name/<-- setzen, header-Dateien in
In source-Dateien, die Sie würde immer verwenden Sie es wie diese
Dann können Sie immer noch verwenden -ich "third_party/include" als include-Ordner und keine Zweideutigkeit in der Bestellung geschehen wird in source-Dateien.
Diese auch disambiguates benutzerdefinierte header-Dateien aus system-header-Dateien, die ggf. aufeinandertreffen von Zeit zu Zeit von 3rd-party-libs.
Wenn
A
undB
sind verschiedene Bibliotheken mit unterschiedlichen header-Dateien und Pfade, sollte es kein problem sein, zu tun, was Sie tun, gerade jetzt.That being said, wenn
A
undB
sind ähnlich wie Bibliotheken enthält header-Dateien mit dem gleichen Namen am gleichen Ort, das ist problematisch. In diesem Fall, die Reihenfolge derinclude_directory()
Anruf ist wichtig. Ich lief einen kleinen test, wo ich drei Exemplare einer header-Datei. Das erste Exemplar befindet sich in meiner system-Pfad (sagen/usr/include
). Die anderen Exemplare befinden sich in zwei benutzerdefinierte Positionen (sagen/tmp/include1
und/tmp/include2
). Die Datei in/tmp/include1
gefunden wird und zuerst verwendet, wenn ich dieinclude_directory()
rufen Sie in der folgenden Reihenfolge:Die Datei in
/tmp/include2
gefunden wird und zuerst verwendet, wenn ich dieinclude_directory()
rufen Sie in der folgenden Reihenfolge:Wenn ich keine
include_directory()
- Anweisung, dann wird die Kopfzeile in der system-Pfad ist gefunden und verwendet.Möglicherweise möchten Sie überprüfen, wie Ihre
FindSomething.cmake
geschrieben werden. Die Suchreihenfolge derfind_*()
CMake-Befehle finden Sie in der CMake-Dokumentation,Soweit ich mich erinnern kann, gibt es jetzt die Möglichkeit zu sagen, CMake zu verwenden
${A_INCLUDE_DIRS}
für alle Header ausA
und${B_INCLUDE_DIRS}
für alle Header ausB
wenn die header-Datei finden Sie im Standort. Es hängt alles davon ab, in welcher Reihenfolge dieinclude_directory()
Anruf gemacht werden. Wenn dieFindSomething.cmake
sind richtig geschrieben, wenn dieCMAKE_MODULE_PATH
(dies ist der Speicherort, in denen CMake Aussehen wird für dieFind*.cmake
- Dateien) richtig eingestellt ist und alle Pfade sind gut, sollten dann Sie gut zu gehen. Wenn nicht, werde ich benötigen Sie mehr Informationen über Ihren aktuellen CMake/Bibliothek-setup.