2016-08-08 2 views
11

Вот фрагмент из макияжа CMakeLists.txt:Транзитивные target_include_directories на объектные библиотеки

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>) 

Теперь это все работает отлично, обе библиотеки генерируются. Однако у меня есть проблема, когда я пытаюсь использовать его:

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

Target bar не компилируется, поскольку включают в себя каталоги из Foo-объекта не распространяются. Если я добавлю target_include_directories прямо на foo, все будет хорошо компилироваться.

Как я могу сделать как foo, так и foo_static автоматически использовать (и пересылать вещи в зависимости от них), включая каталоги от foo-object?

+0

Хорошее название - сложный вопрос легко найти. – CJxD

ответ

3

Hm, в данный момент я придумал следующее:

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}) 

, но давай, там должен быть лучший путь:/

+0

Просто 'target_link_libraries (foo PUBLIC foo-object)' недостаточно? – wasthishelpful

+0

Я попробую, я думаю, он должен работать, возможно? Спасибо, я был уверен, что должен быть умный способ: D – Paladin

+0

@wasthishelpful: хорошая идея, но не работает: «Целевой« foo-object »типа OBJECT_LIBRARY не может быть связан с другой целью. Можно ссылаться только на библиотеки STATIC или SHARED , или исполняемым файлам с набором свойств ENABLE_EXPORTS. " – Paladin

1

кажется, что переходные свойства работают только тогда, когда цели связаны между собой через цепь звонков target_link_library. В вашем случае у вас нет такой связи между foo-object и foo.

Если вы добавите исходный файл в foo, то также не сможете увидеть каталог include от foo-object.

Это может быть недосмотр в дизайне библиотек OBJECT, поскольку он существенно разрушает транзитивные свойства для них.

Смежные вопросы