2016-08-08 6 views
11

ist hier von make CMakeLists.txt Snippet:Transitive target_include_directories auf Objektbibliotheken

add_library(foo-object OBJECT src/foo.cpp) 
target_include_directories(foo-object PUBLIC include) 
add_library(foo SHARED $<TARGET_OBJECTS:${PROJECT_NAME}-object>) 
add_library(foo_static STATIC $<TARGET_OBJECTS:${PROJECT_NAME}-object>) 

Nun, dies alles funktioniert gut, beide Bibliotheken erzeugt werden. Allerdings habe ich ein Problem, wenn ich versuche, es zu benutzen:

add_executable(bar src/main.cpp) 
target_link_libraries(bar foo) 

Ziel bar nicht kompilieren, weil Verzeichnisse von foo-Objekt umfassen nicht weitergegeben werden. Wenn ich auch target_include_directories direkt auf foo hinzufüge, wird alles gut kompilieren.

Wie kann ich sowohl foo als auch foo_static automatisch verwenden (und weiterleiten, um abhängig davon zu stopfen) Verzeichnisse aus foo-object?

+0

Guter Titel - machte eine schwierige Frage leicht zu finden. – CJxD

Antwort

3

Hm, im Moment habe ich mit folgenden aufkam:

add_library(foo-object OBJECT src/foo.cpp) 
target_include_directories(foo-object PUBLIC include) 

get_property(object_include_dirs TARGET foo-object PROPERTY INCLUDE_DIRECTORIES) 
get_property(object_link_libs TARGET foo-object PROPERTY LINK_LIBRARIES) 

add_library(foo SHARED $<TARGET_OBJECTS:${PROJECT_NAME}-object>) 
target_include_directories(foo PUBLIC ${object_include_dirs}) 
target_link_libraries(foo PUBLIC ${object_link_libs}) 

add_library(foo_static STATIC $<TARGET_OBJECTS:${PROJECT_NAME}-object>) 
target_include_directories(foo_static PUBLIC ${object_include_dirs}) 
target_link_libraries(foo_static PUBLIC ${object_link_libs}) 

sondern kommen auf, muss es eine bessere Art und Weise sein:/

+0

Nur 'target_link_libraries (foo PUBLIC foo-object)' ist nicht genug? – wasthishelpful

+0

Ich werde das versuchen, ich denke es sollte funktionieren? Danke, ich war mir ziemlich sicher, dass es einen schlauen Weg geben muss: D – Paladin

+0

@washishilfful: gute Idee, aber nicht funktionierend: "Ziel" foo-object "vom Typ OBJECT_LIBRARY darf nicht mit einem anderen Ziel verbunden sein. Man kann nur mit STATIC- oder SHARED-Bibliotheken verlinken oder ausführbare Dateien mit der Eigenschaft ENABLE_EXPORTS. " – Paladin

1

es, dass transitive Eigenschaften scheint nur funktionieren, wenn Ziele durch ein verknüpft sind Kette von target_link_library Anrufe. In Ihrem Fall haben Sie keine solche Verbindung zwischen foo-object und foo.

Wenn Sie eine Quelldatei zu foo hinzufügen, sollte diese auch nicht das Include-Verzeichnis von foo-object sehen können.

Dies könnte ein Versehen im Design von OBJECT Bibliotheken sein, da es im Wesentlichen die transitiven Eigenschaften für diese bricht.

Verwandte Themen