CMake:向IMPORTED库添加依赖项

时间:2016-04-28 18:24:17

标签: c++ cmake

我有一个供应商提供的库存档,我已导入到我的项目中:

add_library(
    lib_foo 
    STATIC 
    IMPORTED GLOBAL
    )

set_target_properties(
    lib_foo 
    PROPERTIES IMPORTED_LOCATION             
    "${CMAKE_CURRENT_LIST_DIR}/vendor/foo.a"
    )

set_target_properties(
    lib_foo 
    PROPERTIES INTERFACE_INCLUDE_DIRECTORIES 
    "${CMAKE_CURRENT_LIST_DIR}/vendor"
    )

当我尝试使用此库链接应用程序时,我得到undefined reference to 'pthread_atfork'链接器错误:

/usr/lib/libtcmalloc_minimal.a(libtcmalloc_minimal_internal_la-static_vars.o):
    In function `SetupAtForkLocksHandler':
    /tmp/gperftools-2.4/src/static_vars.cc:119: 
        undefined reference to `pthread_atfork'
        ../vendor/foo.a(platformLib.o): In function `foo::Thread::Impl::join()':

因此vendor/foo.a依赖于pthread

我尝试target_link_libraries(lib_foo pthread)但这不起作用,因为lib_foo IMPORTED 目标,而不是构建目标

CMake Error at libfoo/CMakeLists.txt:41 (target_link_libraries):
  Attempt to add link library "pthread" to target "lib_foo"
  which is not built in this directory.

问题:

如何将pthread关联到lib_foo,或指定依赖lib_foo的目标也依赖于pthread?

1 个答案:

答案 0 :(得分:8)

IMPORTED_LINK_INTERFACE_LIBRARIES:

您可以设置其他目标媒体资源IMPORTED_LINK_INTERFACE_LIBRARIES

  

IMPORTED目标的传递链接界面。

     

将其设置为当包含接口时包含的库列表   IMPORTED库目标与另一个目标相关联。

     

库将包含在目标的链接行中。

     

LINK_INTERFACE_LIBRARIES属性不同,此属性适用于所有导入的目标类型,包括STATIC库。

set_target_properties(lib_foo 
    PROPERTIES IMPORTED_LINK_INTERFACE_LIBRARIES 
    pthread
    )

-pthread编译器标志:

但是,在特定情况pthread链接问题中,可能会通过将-pthread添加到编译器标志来解决问题

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread" )

来自man gcc

  

-pthread使用pthreads库添加对多线程的支持。此选项为预处理器和链接器设置标志。

它会导致使用-D_REENTRANT编译文件,并与 - lpthread关联。在其他平台上,这可能会有所不同。使用-pthread获得最多的便携性。

See this question for more information