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 это импортные цель, а не построенная цель

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 to lib_foo, или укажите, что цели с зависимостью от lib_foo также есть зависимость от pthread?

1 ответов


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 для большинства переносимости.

см. этот вопрос для получения дополнительной информации