2016-07-22 2 views
0

Я использую CMake 3.5.2.CMake Включить зависимости импортированной библиотеки без ссылки

Рассмотрите следующую ситуацию. У меня есть импортированная библиотека Foo::Foo:

add_library(Foo::Foo UNKNOWN IMPORTED) 

Этой импортирован библиотека был заселен с соответствующими свойствами:

set_target_properties(Foo::Foo PROPERTIES 
    INTERFACE_INCLUDE_DIRECTORIES "/path/to/include/blah" "/another/path/include/other" 
    IMPORTED_LINK_INTERFACE_LIBRARIES blah other 
    IMPORTED_LOCATION "/path/to/libfoo.a-or-so") 

У меня есть библиотека удобства называется bar. Мне нужно включить в него каталоги включений Foo::Foo, но я не хочу, чтобы он ссылался на Foo::Foo.

add_library(bar STATIC "${BAR_SOURCES}") 

Как я могу добавить только включать зависимости от Foo::Foo? Вот что я пробовал, что не удалось:

# This did not include any includes from Foo::Foo 
target_link_libraries(bar INTERFACE Foo::Foo) 

# This included only the first include directory from Foo::Foo 
target_include_directories(bar PUBLIC "$<TARGET_PROPERTY:Foo::Foo,INTERFACE_INCLUDE_DIRECTORIES>") 
+0

Die вы пытаетесь удалить кавычки из последнего вызова? – Florian

+0

@Florian Нет, но я просто сделал, без разницы. – md5i

ответ

2

Я дал вам пример попробовать. Вы должны изменить код в вашем примере, чтобы:

set_target_properties(
    Foo::Foo PROPERTIES 
     INTERFACE_INCLUDE_DIRECTORIES 
      "/path/to/include/blah;/path/to/include/other" 
     IMPORTED_LINK_INTERFACE_LIBRARIES "blah.a" 
     IMPORTED_LOCATION "/path/to/libfoo.a-or-so" 
) 

Вызов set_target_properties() принимает только/пар «собственность», «значение» (с пробелами в качестве разделителя). И ваш пример просто не вызывал ошибок, потому что вы всегда можете определить свои собственные свойства (с любым именем).

Передайте список включенных каталогов в «Список CMake» (строка с разделенными точкой с запятой).

Alternative

Если вы просто хотите, чтобы «сбросить» транзитивные библиотеки вы можете сделать это с помощью, например:

target_link_libraries(bar Foo::Foo) 
set_target_properties(bar PROPERTIES INTERFACE_LINK_LIBRARIES "") 

я использовал этот подход, когда я строил общую библиотеку тот же проект, который я связывал с тем же (и я не хотел, чтобы зависимости библиотеки разделяемой библиотеки также были связаны с целевой средой с использованием общей библиотеки).

Ссылки

+0

Спасибо. Это действительно проблема. Я действительно задаюсь вопросом, является ли решение с использованием '$ ' правильным, но сейчас это работает. – md5i

+0

@ md5i Добро пожаловать. И жаль, что я забыл ответить на ваш оригинальный вопрос по отладке кода примера. Я обновил свой ответ соответственно. – Florian

+0

Красивый трюк. Я, вероятно, украду у тебя это. :) – md5i

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