C++ - il progetto, ad esempio, foo
viene gestito da cmake. Si desidera creare una libreria libfoo.a
(con tutte le classi/metodi/funzioni create nell'intero albero dei sorgenti) per rendere possibile la creazione di programmi che potrebbero essere collegati alla libreria con -lfoo
.crea una libreria statica da intero progetto con cmake
ok, consideriamo ora un esempio di giocattolo, e il prolbem sarà chiaro. La directory foo
(root del progetto) contiene le directory a
e b
. Due CmakeLists.txt
sono creati:
# a/CMakeLists.txt
add_library(A <a_sources>)
# b/CMakeLists.txt
add_library(B <b_sources>)
E uno CMakeLists.txt
per la directory root:
add_subdirectory(a)
add_subdirectory(b)
add_library(foo <foo_sources>
target_link_libraries(foo A B)
E 'stata una sorpresa per me: dopo aver costruito libfoo.a contiene solo i metodi da foo_sources, e a_sources
, b_sources
sono esclusi. Questo va bene nel caso in cui gli eseguibili siano costruiti con lo stesso progetto: mentre si creano "eseguibili" cmake "indovina" che a
e b
devono essere collegati se sono collegati a foo
. Ma nel caso dell'eseguibile viene creato il progetto "esterno" per utilizzare la libreria foo
occorre un collegamento con -lfoo -la -lb
, ora si immagina un progetto con molte sottodirectory - come gestirlo? quindi la domanda è "come creare una libreria, aggregando metodi dell'intero progetto con mezzi di cmake?"
Googling mi ha portato a un'opportunità relativamente recente incorporata (visualizzata in 2.8.8) OBJECT library
. Un bell'esempio di utilizzo è mostrato here. Ora il problema sopra può essere risolto con questo:
# a/CMakeLists.txt
add_library(A OBJECT <a_sources>)
# b/CMakeLists.txt
add_library(B OBJECT <b_sources>)
# foo/CMakeLists.txt
add_subdirectory(a)
add_subdirectory(b)
add_library(foo <foo_sources> $<TARGET_OBJECTS:A> $<TARGET_OBJECTS:B>)
il problema sembra essere risolto, sfortunatamente, non del tutto.
se la catena di dipendenze è più lunga di 2, ad esempio, foo
dipende da A
, che dipende da B
, il problema rimane ancora. Questo perché,
Le librerie di oggetti possono contenere solo origini (e intestazioni) che compilano i file oggetto.
e
librerie di oggetti non possono essere importati, esportati, installate o collegate.
(citazioni sono tratte dalla stessa link)
Ho provato diverse combinazioni di target_link_library()
, add_library(), add_library(... OBJECT ..)
cercando di collegare A
e B
-foo
senza successo (errore durante cmake-processo.)
Devo perdere qualcosa di semplice, per favore aiutatemi, grazie! Non sono sicuro che sia importante: il progetto viene mantenuto su Linux.