2017-12-18 447 views
0

我遇到CMake get_target_property問題。它在稍後定義的庫上運行並返回錯誤。這是我的代碼:在稍後定義的目標上調用get_target_property()

add_library(UT_pal_logger OBJECT ${SOURCES}) 
target_add_interfaces(UT_pal_logger cppunit_addon) 

在其他文件有:

function(target_add_interfaces TARGET OTHER_TARGETS) 
    foreach(OTHER_TARGET ${OTHER_TARGETS}) 
     get_target_property(TMP_INCLUDES ${OTHER_TARGET} INTERFACE_INCLUDE_DIRECTORIES) 
     if(TMP_INCLUDES) 
     target_include_directories(${TARGET} PUBLIC ${TMP_INCLUDES}) 
     endif() 
    endforeach(OTHER_TARGET) 
endfunction() 

和:

add_library(cppunit_addon STATIC ${SOURCES}) 
target_include_directories(cppunit_addon PUBLIC Include) 

注意cppunit_addon帶來了在UT_pal_logger使用一些頭。

這失敗的消息:

CMake Error at Scripts/CMake/target_add_interfaces.cmake:22 (get_target_property): 
    get_target_property() called with non-existent target "cppunit_addon". 
Call Stack (most recent call first): 
    .../logger/CMakeLists.txt:36 (target_add_interfaces) 

但是這種配置和構建就好:

add_library(UT_pal_logger STATIC ${SOURCES}) 
target_link_libraries(UT_pal_logger cppunit_addon) 

--->target_link_libraries莫名其妙地等待,直到一切都被解析並get_target_property沒有。這也是documented

此命令,可以獲取屬性迄今創建的任何目標

我也可以更改add_directory命令的順序來解決這個問題。但這不是一個乾淨的解決方案。我怎麼能讓get_target_property等到一切都被解析了?

+0

通常包括任何依賴性也需要一個鏈接依賴性。所以我承認,我不明白你想要達到什麼'target_add_interfaces()'函數?如果你有鏈接依賴,你的問題就解決了(公共include目錄會自動傳播)。 – Florian

+0

@Florian,他正試圖爲* OBJECT *庫添加包含目錄:https://stackoverflow.com/questions/47831517/cmake-add-interfaces-but-do-not-link。 – Tsyvarev

回答

1

如果您希望CMake在生成時評估您的財產,而不是在配置時間期間,您總是可以使用generator expressions

如果成功地測試了下面的代碼片斷:

add_library(UT_pal_logger OBJECT ${SOURCES}) 
target_include_directories(
    UT_pal_logger 
    PUBLIC "$<TARGET_PROPERTY:cppunit_addon,INTERFACE_INCLUDE_DIRECTORIES>" 
) 
相關問題