2013-01-15 9 views
9

Quindi sto costruendo una libreria condivisa, su due librerie statiche.come mettere gli argomenti della riga di comando del compilatore in punti specifici usando cmake

This answer dice che il modo per farlo è inserire prima delle mie librerie statiche, il -Wl,--no-whole-archive dopo di loro.

Quindi quello che ho in CMake al momento per la libreria condivisa è:

add_library(wittyPlus SHARED empty.cpp) 
target_link_libraries(wittyPlus 
    ${wtdbosqlite} 
    ${WT_LIBRARIES} 
    ${DB_LIBRARIES} 
    ${Boost_LIBRARIES} 
    app models 
) 

Così che cosa ho bisogno è per poter aggiungere il -Wl,--whole-archive prima app e models, poi -Wl,--no-whole-archive dopo di loro (in modo che il le importazioni di librerie standard non vengono esportate dalla lib condivisa).

Qual è il modo più semplice per farlo in CMake?


Aggiunta: Così mi piacerebbe usare la roba CMake di serie, per quanto possibile, in questo modo non c'è bisogno di fare qualsiasi lavoro extra per le finestre si basa, come CMake rimuove gentilmente le definizioni del compilatore che non sono supportati sulla piattaforma in costruzione.

risposta

14

OK, è stato molto più facile di quanto pensassi.

Quindi, secondo il cmake docs:

I nomi degli elementi che iniziano con '-', ma non '-l' o '-Framework', sono trattati come bandiere linker.

Quindi la correzione è stata solo per:

add_library(wittyPlus SHARED empty.cpp) 
target_link_libraries(wittyPlus 
    ${wtdbosqlite} 
    ${WT_LIBRARIES} 
    ${DB_LIBRARIES} 
    ${Boost_LIBRARIES} 
    "-Wl,--whole-archive" 
    app models 
    "-Wl,--no-whole-archive" 
) 

Non so se funzionerà su Windows o no, mi aspetto che sarà come CMake è super intelligente.

Guardando il risultato con objdump, sembra che ci siano molti elementi di spinta nelle esportazioni, quindi potrei fare qualcosa di sbagliato.

objdump -C -t wittyPlus/libwittyPlus.so | grep -i boost 

Ma ha il materiale necessario per collegarlo, quindi è un passo avanti.

Qualsiasi altra risposta ancora apprezzata. Fondamentalmente quello che sto cercando di fare è la stessa di questa domanda:

CMake: how create a single shared library from all static libraries of subprojects?

+0

Avete trovato un lavoro che non richiede un file 'empty.cpp' nullo? –

+0

No, uso empty.cpp tutto il tempo. – matiu

+3

Sembra che si possa fare 'file (WRITE empty.cpp" ")' se non si vuole inquinare il proprio albero dei sorgenti reale con file spazzatura. –

0

Se si stanno costruendo le librerie statiche da soli, è possibile utilizzare questo approccio: https://stackoverflow.com/a/29824424/4069571 vale a dire la loro costruzione come librerie di oggetti, poi il collegamento li nelle rispettive librerie condivise e statiche.