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