2016-07-27 78 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。我不知道为什么我决定第一次不行。