2015-04-17 9 views
5

Voglio che il mio eseguibile colleghi nuovamente una libreria condivisa (libmy_so.so), che a sua volta è costruita con una libreria statica (libmy_static_lib.a). Quando faccioPerché cmake_link_libraries include librerie statiche?

target_link_libraries(my_exe my_so) 

vedo durante la compilazione che CMake aveva aggiunto libmy_static_lib.a sulla linea di accumulo. Questo non è qualcosa che voglio e non capisco perché sia ​​necessario. C'è un modo per aggirare questo? LINK_PRIVATE non sembra fare alcuna differenza.

Io uso CMake 2.8.9.

risposta

5

Dal CMake documentation for target_link_libraries:

target_link_libraries(<target> [item1 [item2 [...]]] 
         [[debug|optimized|general] <item>] ...) 

[...] dipendenze delle librerie sono transitive per impostazione predefinita con questa firma. Quando questo obiettivo è collegato a un altro bersaglio, le librerie collegate a questo obiettivo appariranno anche sulla linea di collegamento dell'altra destinazione.

La soluzione è quella di utilizzare la firma di target_link_libraries che permette di specificare il comportamento transitiva manualmente:

# we explicitly state that the static lib should not propagate 
# transitively to targets depending on my_so 
target_link_libraries(my_so PRIVATE my_static_lib) 

# nothing has to change for the exe 
target_link_libraries(my_exe my_so) 
+0

privato non sembra esistere per CMake 2,8, e LINK_PRIVATE non funziona per me. Cioè, ottengo lo stesso comportamento come senza LINK_PRiVATE – Rolle

+1

@Rolle Right, questa è una funzionalità che richiede almeno CMake 2.8.11. Con le versioni precedenti, temo che dovrai manomettere a mano le proprietà del bersaglio. Suggerisco caldamente di aggiornare la versione di CMake se possibile. – ComicSansMS

+0

'LINK_PRIVATE' dovrebbe funzionare correttamente con CMake 2.8.9. – steveire