2014-11-18 13 views
5

Ich versuche, den Speicherort einer statischen Bibliothek eines anderen Projekts zu ermitteln. Ich habe versucht,CMAKE So erhalten Sie den Speicherort der Zieldatei

GET_PROPERTY (target_name TARGET-Test PROPERTY LOCATION) aber CMAKE gibt die folgenden Fehler

CMake Error at project.cmake:6 (get_property): 
The LOCATION property may not be read from target "A". 
Use the target name directly with add_custom_command, or use the generator 
expression $<TARGET_FILE>, as appropriate. 

Ich hat versucht, den Generator Ausdruck ohne Erfolg in der Fehlermeldung erwähnt zu verwenden.

MESSAGE($<TARGET_FILE:A>) 

nur ausgibt, die genau die gleiche Zeichenfolge, so dass der Generator Ausdruck überhaupt nicht bewertet zu werden scheint:

$<TARGET_FILE:A> 

ich die Documentation lesen. In den ersten Zeilen erwähnt es:

Generator Ausdrücke während Build-System Generation ausgewertet werden Informationen spezifisch für jede Build-Konfiguration zu erzeugen.

Wenn ich das richtig verstehe, dann werden zum Zeitpunkt der Auswertung der Nachrichtenfunktion die Generatorausdrücke nicht mehr ausgewertet? Also, was soll ich in diesem Fall machen?

beging ich ein minimales Beispiel für dieses Problem auf GitHub

EDIT:

Es tut mir Leid, ohne eine klare Erklärung meiner Absichten, die Frage in einem solchen Umwegen haben gefragt:

Mein Ziel ist, CMake zu bekommen, um eine einzelne (!) Statische Bibliothek für mein Projekt zu bauen, die ein anderer (der CMake nicht benutzt) benutzen kann. Ich würde immer noch die "normale" Auflösung der Abhängigkeiten für mein Projekt verwenden, aber die andere Person - die CMake nicht verwendet - müsste mehrere Bibliotheken manuell mit seinem Projekt verbinden, was etwas unbequem ist. Eine einzelne Bibliothek würde das lösen.

Auf meinem Weg zu versuchen, CMake zu statischen zwei statische Bibliotheken zu verknüpfen, habe ich irgendwo gelesen (Sorry, ich habe keinen Link gespeichert), dass zumindest wenn Sie Visual Studio als Compiler verwenden, können Sie das gewünschte Ergebnis erhalten wenn ich den vollständigen Pfad der statischen Bibliothek anhängen zu den statischen Linker-Flags wie das verknüpft werden:

set_target_properties(B PROPERTIES STATIC_LIBRARY_FLAGS >>>INSERT_PATH_HERE<<<) 

, die in der Tat Arbeit. Aber jetzt würde ich muss händisch den vollständig qualifizierten Pfad einfügen, um die Variable dort

set_target_properties(B PROPERTIES STATIC_LIBRARY_FLAGS "/path/to/library.lib") 

, die scheint nicht zu einem „guten“ Weg, um es mir zu tun. So experimentierte ich mit Generator Ausdrücke und kam mit dem folgenden:

set_target_properties(B PROPERTIES STATIC_LIBRARY_FLAGS $<TARGET_FILE:A>) 

die nicht funktioniert, aus Gründen ich nicht ganz verstehen. Ich denke, set_target_properties unterstützt nur Generatorausdrücke nicht.Bei dem Versuch, mein Projekt zu arbeiten habe ich versucht,

MESSAGE($<TARGET_FILE:A>) 

(wie oben dieser explenation angegeben) und dachte, wenn ich diese Aussage ich mein eigentliches Problem lösen könnte arbeiten würde. So habe ich die oben gestellte Frage gestellt. Ich wusste nicht, dass dies für die Leute, die mir antworten wollten, zu Verwirrung führen würde.

+1

Nachricht kann nicht nehmen Generatorausdrücke. Da sie für jede Build-Konfiguration generiert werden, verhalten sie sich im Vergleich zu normalen Variablen sehr seltsam. Die Frage ist also wirklich, wo versuchen Sie den Zieleigenschaftsstandort zu verwenden? – IdeaHat

+0

Ich möchte ein Linker-Flag erzeugen, wie so eine statische Bibliothek A in eine andere statische Bibliothek B zu verknüpfen: set_target_properties (B PROPERTIES STATIC_LIBRARY_FLAGS $ ) dies nicht funktioniert. Dies führt dazu, dass $ anstelle des Ergebnisses in die Projektdatei generiert wird. Mit message() konnte ich das Problem beheben. Ich denke, wenn ich es mit message() arbeiten kann, sollte es auch mit set_target_properties() funktionieren. – Dirk

Antwort

2

Wenn Sie eine Bibliothek in ein anderes verwenden möchten, sollten Sie target_link_libraries Funktion:

target_link_libraries(B A) 

Die Signatur von target_link_libraries breitet automatisch A in allen nicht-statische Bibliotheken und ausführbare Dateien, die B (sowohl direkt als auch indirekt verwenden).

Statische Bibliotheken, die B verwenden, sind sich ihrer Abhängigkeit von A bewusst, aber sie werden keine Kopie der Objektdateien von A in ihnen haben. Die Abhängigkeitsinformation wird in INTERFACE_LINK_LIBRARIES und LINK_LIBRARIES Zieleigenschaften der Bibliotheken übertragen.

Eine statische Bibliothek ist von Grund auf nur ein Archiv von Objektdateien. Es besteht keine Notwendigkeit, Objektdateien aus verschiedenen Bibliotheken manuell miteinander zu mischen, wenn Sie nur die Bibliotheken in Ihrem CMake-Projekt verwenden möchten. CMake weist Ihren Linker mit der Liste der Bibliotheken an, die in die richtige Reihenfolge der Bibliotheken (die tatsächlich aus dem Abhängigkeitsgraphen erzeugt wird) eingebunden werden müssen. Der Linker wiederum löst alle Symbole aus den Objektdateien auf, die in den bereitgestellten statischen Bibliotheken enthalten sind.

Wenn Sie noch eine genaue Steuerung der Mischung haben, müssen Objekte Dateien, könnten Sie betrachten OBJECT library type zu verwenden:

# Create plain objects library which essentially is a set of object files 
add_library(zipobj OBJECT zip.cpp) 
# Archive all objects from zipobj. Recompilation of zip.cpp won't take place. 
add_library(zip STATIC $<TARGET_OBJECTS:zipobj>) 

add_library(lzmaobj OBJECT lzma.zpp) 
add_library(lzma STATIC $<TARGET_OBJECTS:lzmaobj>) 

# Create a library which contains object files from both zipobj and lzmaobj 
add_library(archive STATIC $<TARGET_OBJECTS:zipobj> $<TARGET_OBJECTS:lzmaobj>) 

EDIT: Auch könnten Sie merge_libraries Funktion versuchen: http://www.mail-archive.com/[email protected]/msg28670.html

+0

Danke für deine Antwort roolebo, aber afaik, die nur bedeutet, "Wenn jemand Links gegen B automatisch Link A auch". Ich möchte, dass A in B real enthalten ist, sodass, wenn ich die Bibliothek nehme und sie woanders verwende, alles darin enthalten ist. – Dirk

+0

@Dirk, ich habe die Antwort geklärt. Wahrscheinlich ist OBJECT Bibliothekstyp, wonach Sie suchen. – roolebo

+0

Nochmals vielen Dank für Ihre Antwort. Es scheint, dass ich meine Absichten nicht klar genug dargelegt habe. Ich habe meine Frage oben geklärt. Ich möchte nur einen einzigen CMake, um eine statische Bibliothek zu erstellen, die alle Symbole enthält, ohne meine Bibliotheksstruktur zu zerstören. – Dirk

Verwandte Themen