2015-04-17 2 views
5

Ich möchte meine ausführbare Datei gegen eine gemeinsame Bibliothek (libmy_so.so), die wiederum mit einer statischen Bibliothek (libmy_static_lib.a) gebaut wird. Als ichWarum enthält cmake_link_libraries statische Bibliotheken?

target_link_libraries(my_exe my_so) 

sehe ich beim Kompilieren dass Cmake libmy_static_lib.a auf der Build-Zeile hinzugefügt hatte. Das ist nichts, was ich will und ich verstehe nicht, warum das nötig ist. Gibt es einen Weg dazu? LINK_PRIVATE scheint keinen Unterschied zu machen.

Ich benutze CMake 2.8.9.

Antwort

5

Vom CMake documentation for target_link_libraries:

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

[...] Bibliothek Abhängigkeiten transitiv sind standardmäßig mit dieser Signatur. Wenn dieses Ziel mit einem anderen Ziel verknüpft ist, werden die mit diesem Ziel verknüpften Bibliotheken auch in der Verbindungslinie für das andere Ziel angezeigt.

Die Lösung ist die Unterschrift von target_link_libraries zu verwenden, die manuell transitiv Verhalten angeben können:

# 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

Die PRIVATE scheint nicht für CMake 2.8 zu existieren, und LINK_PRIVATE funktioniert nicht für mich. Das heißt, ich bekomme das gleiche Verhalten wie ohne LINK_PRiVATE – Rolle

+1

@Rolle Richtig, das ist eine Funktion, die mindestens CMake 2.8.11 erfordert. Mit früheren Versionen befürchte ich, dass Sie sich mit den Zieleigenschaften von Hand anlegen müssen. Ich würde Ihnen dringend empfehlen, Ihre CMake-Version zu aktualisieren, wenn möglich. – ComicSansMS

+0

'LINK_PRIVATE' sollte mit CMake 2.8.9 funktionieren. – steveire

Verwandte Themen