2014-11-18 20 views
5

Sto cercando di ottenere il percorso di una libreria statica di un altro progetto. Ho provatoCMAKE Come ottenere la destinazione del file di destinazione

get_property (nome_destinazione TARGET prova SIAMO), ma CMAKE dà il seguente errore

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. 

Ho cercato di usare l'espressione generatore menzionato nel messaggio di errore senza successo.

MESSAGE($<TARGET_FILE:A>) 

appena uscite stessa stringa esatta, in modo che il generatore di espressione non sembra essere valutati affatto:

$<TARGET_FILE:A> 

ho letto il Documentation. Nelle prime righe menziona: espressioni

Generator vengono valutati durante la generazione sistema di compilazione per produrre informazioni specifiche per ogni configurazione di generazione.

Se sto capendo correttamente questo al momento in cui viene valutata la funzione del messaggio le espressioni del generatore non vengono più valutate? Quindi cosa dovrei fare in questo caso?

ho commesso un esempio minimo di questo problema su GitHub

EDIT:

Mi dispiace di aver fatto la domanda in un modo così rotonda senza una chiara spiegazione delle mie intenzioni:

Il mio obiettivo è quello di ottenere CMake per costruire una singola libreria (!) Statica(!) Per il mio progetto, che può essere utilizzata da qualcun altro (che non usa CMake). Userei ancora la risoluzione "normale" delle dipendenze per il mio progetto, ma l'altra persona - che non usa CMake - dovrebbe manualmente collegare più librerie al suo progetto, il che è piuttosto scomodo. Una singola biblioteca risolverebbe questo.

Sul mio modo di far sì che CMake colleghi staticamente due librerie statiche, ho letto da qualche parte (mi dispiace, non ho salvato un collegamento) che almeno quando si utilizza Visual Studio come compilatore è possibile ottenere il risultato desiderato se aggiungo il percorso completo della libreria statica da collegare alle bandiere linker statica come quella:

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

che fa nel lavoro fatto. Ma ora avrei dovuto inserire manualy il percorso completo alla variabile ci

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

che non sembra essere un modo "buono" per farlo a me. Così ho sperimentato con le espressioni del generatore e si avvicinò con la seguente:

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

che non funziona, per ragioni che non capiscono fino in fondo. Immagino che set_target_properties non supporti le espressioni del generatore.Pur cercando di ottenere il mio progetto al lavoro ho cercato

MESSAGE($<TARGET_FILE:A>) 

(come detto sopra questo explenation) e ho pensato che se avrei avuto quella dichiarazione di lavorare ho potuto risolvere il mio problema reale. Questo è quello che ho posto alla domanda posta sopra. Non mi rendevo conto che questo avrebbe portato a confusione per le persone che cercavano di rispondermi.

+1

messaggio non può prendere espressioni generatrici. Poiché vengono generati per ogni configurazione di build, si comportano in modo molto strano rispetto alle variabili normali. Quindi la domanda è, dove stai cercando di usare la posizione della proprietà di destinazione? – IdeaHat

+0

voglio generare una bandiera linker per collegare una libreria statica A in un'altra libreria statica B in questo modo: set_target_properties (B PROPRIETÀ STATIC_LIBRARY_FLAGS $ ) questo non funziona. Il risultato è $ TARGET_FILE: A> generato nel file di progetto invece del suo risultato. Usare message() è stato un mezzo per me per eseguire il debug del problema. Immagino che quando avrò modo di lavorare con message() dovrebbe funzionare anche con set_target_properties(). – Dirk

risposta

2

Se si desidera utilizzare una libreria in un altro quello che si dovrebbe usare target_link_libraries funzione:

target_link_libraries(B A) 

La firma del target_link_libraries propaga automaticamente A in tutte le librerie ed eseguibili che utilizzano B (sia direttamente che indirettamente, non statici).

Le librerie statiche che utilizzano B sono a conoscenza della loro dipendenza su A ma non avranno una copia dei file di oggetti da A al loro interno. Le informazioni sulla dipendenza vengono trasportate nelle proprietà target delle librerie nelle proprietà INTERFACE_LINK_LIBRARIES e LINK_LIBRARIES.

In base alla progettazione, una libreria statica è solo un archivio di file oggetto. Non è necessario mescolare insieme i file oggetto da librerie diverse manualmente se si desidera utilizzare solo le librerie all'interno del progetto CMake. CMake istruirà il tuo linker con l'elenco delle librerie che devono essere collegate e l'ordine corretto delle librerie (che in effetti è prodotto dal grafico delle dipendenze). Il linker, a sua volta, risolverà tutti i simboli dai file oggetto che sono trasportati nelle librerie statiche fornite.

Se ancora bisogno di avere un controllo preciso della miscelazione oggetti file, si potrebbe prendere in considerazione di utilizzare OBJECT library type:

# 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: È possibile anche provare merge_libraries funzione: http://www.mail-archive.com/[email protected]/msg28670.html

+0

Grazie per la tua risposta roolebo, ma afaik che significa solo "fare se qualcuno collega B" collega automaticamente anche A ". Voglio che A sia incluso in B per davvero, in modo che se prendo la libreria e la usi altrove, tutto è incluso in essa. – Dirk

+0

@Dirk, ho chiarito la risposta. Probabilmente il tipo di libreria OBJECT è ciò che stai cercando. – roolebo

+0

Grazie ancora per la risposta. Sembra che non abbia dichiarato chiaramente le mie intenzioni. Ho chiarito la mia domanda sopra. Voglio solo un singolo CMake per creare una libreria statica che includa tutti i simboli senza rovinare la struttura della mia biblioteca. – Dirk

Problemi correlati