2016-07-22 56 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

死你嘗試從最後一次通話刪除引號? – Florian

+0

@弗洛裏安不,但我只是,沒有區別。 – 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列表」(帶有分號分隔元素的字符串)。

替代

如果你只是想「重置」傳遞庫,你可以使用如這樣做:

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

我用這種方法,當我建立一個共享庫與我鏈接的項目相同(並且我不希望共享庫的庫依賴項也使用共享庫鏈接到目標中)。

參考

+0

謝謝。這確實是問題所在。我不知道是否使用'$ '的解決方案是正確的,但現在可以使用。 – md5i

+0

@ md5i不客氣。抱歉,我忘記了通過調試示例代碼來回答您的原始問題。我相應地更新了我的答案。 – Florian

+0

好戲。我可能會偷你的那一個。 :) – md5i