我有一个供应商提供的库存档,我已导入到我的项目中:
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?
答案 0 :(得分:8)
您可以设置其他目标媒体资源IMPORTED_LINK_INTERFACE_LIBRARIES
IMPORTED
目标的传递链接界面。将其设置为当包含接口时包含的库列表
IMPORTED
库目标与另一个目标相关联。库将包含在目标的链接行中。
与
LINK_INTERFACE_LIBRARIES
属性不同,此属性适用于所有导入的目标类型,包括STATIC
库。
set_target_properties(lib_foo
PROPERTIES IMPORTED_LINK_INTERFACE_LIBRARIES
pthread
)
但是,在特定情况,pthread
链接问题中,可能会通过将-pthread
添加到编译器标志来解决问题
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread" )
来自man gcc
:
-pthread
使用pthreads库添加对多线程的支持。此选项为预处理器和链接器设置标志。
它会导致使用-D_REENTRANT
编译文件,并与 - lpthread
关联。在其他平台上,这可能会有所不同。使用-pthread
获得最多的便携性。