2016-07-27 17 views
0

CMake的3.5及物動詞需要進口圖書館等進口庫的接口

我有一個現有的外部庫,我已經在我的CMakeLists.txt作出了IMPORTED庫:

find_path(
    FOO_INCLUDE_DIR NAMES foo.h 
    PATHS "${FOO_ROOT}" 
    NO_DEFAULT_PATH 
    PATH_SUFFIXES include/foo 
) 
find_library(
    FOO_LIBRARY NAMES foo 
    PATHS "${FOO_ROOT}" 
    PATH_SUFFIXES lib 
) 
mark_as_advanced(FOO_INCLUDE_DIR FOO_LIBRARY) 
find_package_handle_standard_args(
    FOO REQUIRED_VARS 
    FOO_INCLUDE_DIR 
    FOO_LIBRARY 
) 
add_library(Foo::Foo SHARED IMPORTED) 
set_property(TARGET Foo::Foo 
    PROPERTY INTERFACE_INCLUDE_DIRECTORIES 
    "${FOO_INCLUDE_DIR}" "${BAR_INCLUDE_DIR}" 
    "${Boost_INCLUDE_DIRS}" "${BAZ_INCLUDE_DIR}" 
) 
set_property(TARGET Foo::Foo 
    PROPERTY IMPORTED_LOCATION 
    "${FOO_LIBRARY}" 
) 
set_property(TARGET Foo::Foo 
    PROPERTY INTERFACE_LINK_LIBRARIES 
    "${Boost_LIBRARIES}" "${BAR_LIBRARY}" "${BAZ_LIBRARIES}" 
) 

程序,與此特定庫鏈接需要線程支持。添加線程支持的東西是相當簡單:

set(THREADS_PREFER_PTHREAD_FLAG on) 
include(FindThreads) 
... 
target_link_libraries(something PUBLIC Threads::Threads) 

我想任何對Foo::Foo鏈接到自動包括Threads::Threads。但是您不能在IMPORTED庫上使用target_link_libraries()。那麼如何從Foo::Foo過渡性地要求Threads::Threads

我設法通過執行以下操作來解決此問題,但它依賴於我檢查以查看上設置的屬性FindThreads。有沒有更好的辦法?

set_property(TARGET Foo::Foo 
    PROPERTY INTERFACE_LINK_LIBRARIES 
    "${Boost_LIBRARIES}" "${BAR_LIBRARY}" "${BAZ_LIBRARIES}" 
    $<TARGET_PROPERTY:Threads::Threads,INTERFACE_LINK_LIBRARIES> 
) 
set_property(TARGET Foo::Foo 
    PROPERTY INTERFACE_COMPILE_OPTIONS 
    $<TARGET_PROPERTY:Threads::Threads,INTERFACE_COMPILE_OPTIONS> 
) 
+0

您是否嘗試過[add_dependencies](https://cmake.org/cmake/help/latest/command/add_dependencies.html)? – wasthishelpful

回答

0

事實證明,答案很簡單。我簡單地需要將Threads::Threads添加到INTERFACE_LINK_LIBRARIES財產Foo::Foo。我不知道爲什麼我決定第一次不行。