2017-12-18 7 views
0

CMake get_target_propertyに問題があります。後で定義されたライブラリで実行され、エラーが返されます。 cppunit_addonUT_pal_loggerで使用されるいくつかのヘッダをもたらし後で定義されたターゲットでget_target_property()を呼び出す

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

注こと:他のファイルで

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

とこれは私のコードです。

これはメッセージで失敗します。

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) 

しかし、これは設定して、うまく構築します。すべてが解析され、get_target_propertyにはないされるまで

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

--->target_link_librariesは何とか待ちます。また、これはdocumented次のとおりです。

このコマンドは、これまで作成した任意のターゲットのプロパティを取得することができます。

これを修正するために、add_directoryコマンドの順序を変更することもできます。しかし、これはクリーンな解決策ではありません。すべてが解析されるまで、どうすればget_target_propertyを待つことができますか?

+0

があれば成功し、次のコードスニペットをテストしました。ですから、あなたが 'target_add_interfaces()'関数を実現しようとしていることを私が理解していないことは認めていますか?リンク依存関係がある場合、問題は解決されます(パブリックインクルードディレクトリは自動的に伝播されます)。 – Florian

+0

@Florian、彼は* OBJECT * libraryのインクルードディレクトリを追加しようとしています: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>" 
) 
関連する問題