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.
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
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