cmake:find_package查找pthread for win32的实现脚本

本文介绍了一个自定义的CMake脚本FindPTHREADW32,用于在Windows环境下查找和使用PTHREADW32库。该脚本不仅输出了必要的路径和库文件位置,还定义了importedtarget,简化了库的引用过程。

pthread for win32本身没有提供find_package脚本,cmake官方也没有提供,所以如果在cmake中要查找pthread for win32的库,就得自己实现,我参照FindJPEG.cmake自己写了个查找脚本FindPTHREADW32
cmake官方提供的FindJPEG.cmake非常简单,只输出了include文件夹位置和JPEG库文件(JPEG_INCLUDE_DIRJPEG_LIBRARIES),在写FindPTHREADW32时,为了更方便的引用库,在输出PTHREADW32_INCLUDE_DIRPTHREADW32_LIBRARY变量的基础上,还提供了imported target:pthreadw32,

有了imported target定义,在cmake脚本中引用库更加方便,示例如下:

if(WIN32)
	find_package(PTHREADW32 REQUIRED)
endif(WIN32)
# 为${_target}添加依赖库pthreadw32
if(TARGET pthreadw32)
	target_link_libraries(${_target} PUBLIC pthreadw32)
elseif(HAVE_PTHREAD)
	target_link_libraries(${_target} PUBLIC -lpthread)
endif()

下面是我参照FindJPEG.cmake写的完整的实现代码

# FindPTHREADW32
# --------
#
# Find Pthread for win32
#
# Find the native pthread for win32 includes and library This module defines
#
# ::
#
#   PTHREADW32_INCLUDE_DIR, where to find pthread.h, etc.
#   PTHREADW32_LIBRARY, where to find the pthread for win32 library.
#   PTHREADW32_FOUND, If false, do not try to use pthread for win32.
#   HAVE_PTHREAD, if true, pthread supported by compiler
#
#   IMPORTED TARGET: pthreadw32
#=============================================================================

if(NOT WIN32)
	return()
endif()
# 检查编译器是否支持pthread如果支持就返回, 
# POSIX版本的MinGW原生支持pthread,不需要额外的pthread for win32库
include(CheckLibraryExists)
CHECK_LIBRARY_EXISTS (pthread pthread_rwlock_init "" HAVE_PTHREAD)
if(HAVE_PTHREAD)
	message(STATUS "pthread supported")
	return()
endif()
# 查找pthread.h 头文件位置
find_path(PTHREADW32_INCLUDE_DIR pthread.h)
set(PTHREADW32_NAME pthread)
if(MSVC)
	set(PTHREADW32_NAME pthread.lib pthreadVC2)
elseif(MINGW)
	set(PTHREADW32_NAME libpthread.a pthreadGC2)	
endif()
if( CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|x64|AMD64|Win64")
	set(_arch  "x64")
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES  "Win32|x86")
	set(_arch  "x86")
endif()
# 查找库文件
find_library(PTHREADW32_LIBRARY NAMES ${PTHREADW32_NAME} pthread PATH_SUFFIXES lib/${_arch} )

# handle the QUIETLY and REQUIRED arguments and set PTHREADW32_FOUND to TRUE if
# all listed variables are TRUE
include(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(PTHREADW32 DEFAULT_MSG PTHREADW32_LIBRARY PTHREADW32_INCLUDE_DIR)

mark_as_advanced(PTHREADW32_LIBRARY PTHREADW32_INCLUDE_DIR )
#message(STATUS PTHREADW32_INCLUDE_DIR=${PTHREADW32_INCLUDE_DIR})

if(PTHREADW32_FOUND) 
	if(MSVC)
		set(_dll_name pthreadVC2.dll)
	elseif(MINGW)
		set(_dll_name pthreadGC2.dll)	
	endif()
	find_file(PTHREADW32_DLL ${_dll_name} PATH_SUFFIXES dll/${_arch})
	#message(STATUS PTHREADW32_DLL=${PTHREADW32_DLL})
	# 创建imported target
	add_library(pthreadw32 UNKNOWN IMPORTED)
	set_target_properties(pthreadw32 PROPERTIES
	  INTERFACE_INCLUDE_DIRECTORIES "${PTHREADW32_INCLUDE_DIR}"
	  IMPORTED_LINK_INTERFACE_LANGUAGES "C"
	  IMPORTED_LOCATION "${PTHREADW32_LIBRARY}"
	  )
	
	# 解决 Visual Studio 2015下编译struct timespec重定义问题
	if(MSVC)
		# 检查是否定义了 struct timespec
		include(CheckStructHasMember)
		CHECK_STRUCT_HAS_MEMBER("struct timespec" tv_sec time.h HAVE_STRUCT_TIMESPEC LANGUAGE C )  
		if(HAVE_STRUCT_TIMESPEC)
			set_target_properties(pthreadw32 PROPERTIES INTERFACE_COMPILE_DEFINITIONS HAVE_STRUCT_TIMESPEC )
		endif()
	endif()
endif()

unset(_arch)
u1804@u1804-Lenovo-Legion-R9000K2021H:~/study/cartographer_install$ ./auto-carto-build.sh [sudo] u1804 的密码: /home/u1804/study/cartographer_install -- The C compiler identification is GNU 7.5.0 -- The CXX compiler identification is GNU 7.5.0 -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working C compiler: /usr/bin/cc - skipped -- Detecting C compile features -- Detecting C compile features - done -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Check for working CXX compiler: /usr/bin/c++ - skipped -- Detecting CXX compile features -- Detecting CXX compile features - done -- Build type: Release 文件 /home/u1804/study/cartographer_install/cartographer/build/AllFiles.cmake 和 - 不同 -- Looking for pthread.h -- Looking for pthread.h - found -- Performing Test CMAKE_HAVE_LIBC_PTHREAD -- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed -- Looking for pthread_create in pthreads -- Looking for pthread_create in pthreads - not found -- Looking for pthread_create in pthread -- Looking for pthread_create in pthread - found -- Found Threads: TRUE -- Found GMock: /usr/local/lib/libgmock_main.a;/usr/local/lib/libgmock.a;/usr/local/lib/libgtest.a;-lpthread CMake Warning (dev) at /usr/local/share/cmake-3.20/Modules/FindPackageHandleStandardArgs.cmake:438 (message): The package name passed to `find_package_handle_standard_args` (Threads) does not match the name of the calling package (absl). This can lead to problems in calling code that expects `find_package` result variables (e.g., `_FOUND`) to follow a certain pattern. Call Stack (most recent call first): /usr/local/share/cmake-3.20/Modules/FindThreads.cmake:238 (FIND_PACKAGE_HANDLE_STANDARD_ARGS) /usr/local/lib/cmake/absl/abslConfig.cmake:3 (include) CMakeLists.txt:32 (find_package) This warning is for project developers. Use -Wno-dev to suppress it. -- Found Boost: /usr/include (found version "1.65.1") found components: iostreams regex -- Found installed version of Eigen: /usr/lib/cmake/eigen3 -- Found required Ceres dependency: Eigen version 3.3.4 in /usr/include/eigen3 -- Found required Ceres dependency: glog -- Found installed version of gflags: /usr/lib/x86_64-linux-gnu/cmake/gflags -- Detected gflags version: 2.2.1 -- Found required Ceres dependency: gflags -- Found Ceres version: 1.13.0 installed in: /usr/local with components: [LAPACK, SuiteSparse, SparseLinearAlgebraLibrary, CXSparse, SchurSpecializations, C++11, OpenMP] CMake Warning (dev) at /usr/local/share/cmake-3.20/Modules/FindPackageHandleStandardArgs.cmake:438 (message): The package name passed to `find_package_handle_standard_args` (Lua) does not match the name of the calling package (LuaGoogle). This can lead to problems in calling code that expects `find_package` result variables (e.g., `_FOUND`) to follow a certain pattern. Call Stack (most recent call first): cmake/modules/FindLuaGoogle.cmake:211 (FIND_PACKAGE_HANDLE_STANDARD_ARGS) CMakeLists.txt:41 (find_package) This warning is for project developers. Use -Wno-dev to suppress it. -- Found Lua: /usr/lib/x86_64-linux-gnu/liblua5.2.so;/usr/lib/x86_64-linux-gnu/libm.so (found version "5.2.4") -- Found Protobuf: /usr/local/lib/libprotobuf.a;-lpthread (found suitable version "3.4.0", minimum required is "3.0.0") -- Found PkgConfig: /usr/bin/pkg-config (found version "0.29.1") -- Checking for one of the modules 'cairo>=1.12.16' -- Found Sphinx: /usr/bin/sphinx-build -- Configuring done -- Generating done -- Build files have been written to: /home/u1804/study/cartographer_install/cartographer/build [42/381] cd /home/u1804/study/cartogra...all/cartographer/build/AllFiles.cmake" 文件 /home/u1804/study/cartographer_install/cartographer/build/AllFiles.cmake 和 - 不同 [43/381] Building documentation. Running Sphinx v1.6.7 making output directory... loading pickled environment... not yet created building [mo]: targets for 0 po files that are out of date building [html]: targets for 6 source files that are out of date updating environment: 6 added, 0 changed, 0 removed reading sources... [ 16%] configuration reading sources... [ 33%] cost_functions reading sources... [ 50%] evaluation reading sources... [ 66%] index reading sources... [ 83%] pbstream_migration reading sources... [100%] terminology looking for now-outdated files... none found pickling environment... done checking consistency... done preparing documents... done writing output... [ 16%] configuration writing output... [ 33%] cost_functions writing output... [ 50%] evaluation writing output... [ 66%] index writing output... [ 83%] pbstream_migration writing output... [100%] terminology generating indices... genindex writing additional pages... search copying images... [ 50%] high_level_system_overview.png copying images... [100%] autogenerate_groundtruth.png copying static files... done copying extra files... done dumping search index in English (code: en) ... done dumping object inventory... done build succeeded. [265/381] Linking CXX executable cartographer_print_configuration FAILED: cartographer_print_configuration : && /usr/bin/c++ -O3 -DNDEBUG -rdynamic CMakeFiles/cartographer_print_configuration.dir/cartographer/common/print_configuration_main.cc.o -o cartographer_print_configuration libcartographer.a /usr/local/lib/libceres.a -lglog /usr/lib/x86_64-linux-gnu/libgflags.so.2.2.1 -lspqr -ltbb -ltbbmalloc -lcholmod -lccolamd -lcamd -lcolamd -lamd -llapack -lblas -lf77blas -latlas -lsuitesparseconfig -lrt -lcxsparse -llapack -lblas -lf77blas -latlas -lsuitesparseconfig -lrt -lcxsparse -lgomp -llua5.2 -lm -lboost_iostreams -lboost_regex -lglog /usr/lib/x86_64-linux-gnu/libgflags.so.2.2.1 -lcairo /usr/local/lib/libprotobuf.a /usr/local/lib/libabsl_leak_check.a /usr/local/lib/libabsl_hash.a /usr/local/lib/libabsl_bad_variant_access.a /usr/local/lib/libabsl_city.a /usr/local/lib/libabsl_raw_hash_set.a /usr/local/lib/libabsl_bad_optional_access.a /usr/local/lib/libabsl_hashtablez_sampler.a /usr/local/lib/libabsl_str_format_internal.a /usr/local/lib/libabsl_synchronization.a /usr/local/lib/libabsl_stacktrace.a /usr/local/lib/libabsl_graphcycles_internal.a /usr/local/lib/libabsl_symbolize.a /usr/local/lib/libabsl_malloc_internal.a /usr/local/lib/libabsl_debugging_internal.a /usr/local/lib/libabsl_demangle_internal.a /usr/local/lib/libabsl_time.a /usr/local/lib/libabsl_strings.a /usr/local/lib/libabsl_strings_internal.a /usr/local/lib/libabsl_throw_delegate.a /usr/local/lib/libabsl_base.a /usr/local/lib/libabsl_dynamic_annotations.a /usr/local/lib/libabsl_spinlock_wait.a -lpthread /usr/local/lib/libabsl_int128.a /usr/local/lib/libabsl_civil_time.a /usr/local/lib/libabsl_time_zone.a -lpthread && : CMakeFiles/cartographer_print_configuration.dir/cartographer/common/print_configuration_main.cc.o:在函数‘cartographer::common::PrintSubdictionaryById(cartographer::common::LuaParameterDictionary*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)’中: print_configuration_main.cc:(.text+0x2c3):对‘absl::ByChar::Find(std::basic_string_view<char, std::char_traits<char> >, unsigned long) const’未定义的引用 print_configuration_main.cc:(.text+0x84d):对‘absl::ByChar::Find(std::basic_string_view<char, std::char_traits<char> >, unsigned long) const’未定义的引用 CMakeFiles/cartographer_print_configuration.dir/cartographer/common/print_configuration_main.cc.o:在函数‘absl::strings_internal::Splitter<absl::ByChar, absl::SkipEmpty>::ConvertToContainer<std::vector<std::basic_string_view<char, std::char_traits<char> >, std::allocator<std::basic_string_view<char, std::char_traits<char> > > >, std::basic_string_view<char, std::char_traits<char> >, false>::operator()(absl::strings_internal::Splitter<absl::ByChar, absl::SkipEmpty> const&) const’中: print_configuration_main.cc:(.text._ZNK4absl16strings_internal8SplitterINS_6ByCharENS_9SkipEmptyEE18ConvertToContainerISt6vectorISt17basic_string_viewIcSt11char_traitsIcEESaISA_EESA_Lb0EEclERKS4_[_ZNK4absl16strings_internal8SplitterINS_6ByCharENS_9SkipEmptyEE18ConvertToContainerISt6vectorISt17basic_string_viewIcSt11char_traitsIcEESaISA_EESA_Lb0EEclERKS4_]+0x105):对‘absl::ByChar::Find(std::basic_string_view<char, std::char_traits<char> >, unsigned long) const’未定义的引用 print_configuration_main.cc:(.text._ZNK4absl16strings_internal8SplitterINS_6ByCharENS_9SkipEmptyEE18ConvertToContainerISt6vectorISt17basic_string_viewIcSt11char_traitsIcEESaISA_EESA_Lb0EEclERKS4_[_ZNK4absl16strings_internal8SplitterINS_6ByCharENS_9SkipEmptyEE18ConvertToContainerISt6vectorISt17basic_string_viewIcSt11char_traitsIcEESaISA_EESA_Lb0EEclERKS4_]+0x20d):对‘absl::ByChar::Find(std::basic_string_view<char, std::char_traits<char> >, unsigned long) const’未定义的引用 collect2: error: ld returned 1 exit status [266/381] Linking CXX executable cartographer_pbstream FAILED: cartographer_pbstream : && /usr/bin/c++ -O3 -DNDEBUG -rdynamic CMakeFiles/cartographer_pbstream.dir/cartographer/io/pbstream_main.cc.o -o cartographer_pbstream libcartographer.a /usr/local/lib/libceres.a -lglog /usr/lib/x86_64-linux-gnu/libgflags.so.2.2.1 -lspqr -ltbb -ltbbmalloc -lcholmod -lccolamd -lcamd -lcolamd -lamd -llapack -lblas -lf77blas -latlas -lsuitesparseconfig -lrt -lcxsparse -llapack -lblas -lf77blas -latlas -lsuitesparseconfig -lrt -lcxsparse -lgomp -llua5.2 -lm -lboost_iostreams -lboost_regex -lglog /usr/lib/x86_64-linux-gnu/libgflags.so.2.2.1 -lcairo /usr/local/lib/libprotobuf.a /usr/local/lib/libabsl_leak_check.a /usr/local/lib/libabsl_hash.a /usr/local/lib/libabsl_bad_variant_access.a /usr/local/lib/libabsl_city.a /usr/local/lib/libabsl_raw_hash_set.a /usr/local/lib/libabsl_bad_optional_access.a /usr/local/lib/libabsl_hashtablez_sampler.a /usr/local/lib/libabsl_str_format_internal.a /usr/local/lib/libabsl_synchronization.a /usr/local/lib/libabsl_stacktrace.a /usr/local/lib/libabsl_graphcycles_internal.a /usr/local/lib/libabsl_symbolize.a /usr/local/lib/libabsl_malloc_internal.a /usr/local/lib/libabsl_debugging_internal.a /usr/local/lib/libabsl_demangle_internal.a /usr/local/lib/libabsl_time.a /usr/local/lib/libabsl_strings.a /usr/local/lib/libabsl_strings_internal.a /usr/local/lib/libabsl_throw_delegate.a /usr/local/lib/libabsl_base.a /usr/local/lib/libabsl_dynamic_annotations.a /usr/local/lib/libabsl_spinlock_wait.a -lpthread /usr/local/lib/libabsl_int128.a /usr/local/lib/libabsl_civil_time.a /usr/local/lib/libabsl_time_zone.a -lpthread && : libcartographer.a(histogram.cc.o):在函数‘cartographer::common::Histogram::ToString[abi:cxx11](int) const’中: histogram.cc:(.text+0x3f4):对‘absl::strings_internal::CatPieces[abi:cxx11](std::initializer_list<std::basic_string_view<char, std::char_traits<char> > >)’未定义的引用 histogram.cc:(.text+0xb60):对‘absl::strings_internal::AppendPieces(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::initializer_list<std::basic_string_view<char, std::char_traits<char> > >)’未定义的引用 collect2: error: ld returned 1 exit status [282/381] Building CXX object CMakeFiles/car...nal/3d/local_trajectory_builder_3d_test.cc.o ninja: build stopped: subcommand failed. [2/104] Linking CXX executable cartographer_print_configuration FAILED: cartographer_print_configuration : && /usr/bin/c++ -O3 -DNDEBUG -rdynamic CMakeFiles/cartographer_print_configuration.dir/cartographer/common/print_configuration_main.cc.o -o cartographer_print_configuration libcartographer.a /usr/local/lib/libceres.a -lglog /usr/lib/x86_64-linux-gnu/libgflags.so.2.2.1 -lspqr -ltbb -ltbbmalloc -lcholmod -lccolamd -lcamd -lcolamd -lamd -llapack -lblas -lf77blas -latlas -lsuitesparseconfig -lrt -lcxsparse -llapack -lblas -lf77blas -latlas -lsuitesparseconfig -lrt -lcxsparse -lgomp -llua5.2 -lm -lboost_iostreams -lboost_regex -lglog /usr/lib/x86_64-linux-gnu/libgflags.so.2.2.1 -lcairo /usr/local/lib/libprotobuf.a /usr/local/lib/libabsl_leak_check.a /usr/local/lib/libabsl_hash.a /usr/local/lib/libabsl_bad_variant_access.a /usr/local/lib/libabsl_city.a /usr/local/lib/libabsl_raw_hash_set.a /usr/local/lib/libabsl_bad_optional_access.a /usr/local/lib/libabsl_hashtablez_sampler.a /usr/local/lib/libabsl_str_format_internal.a /usr/local/lib/libabsl_synchronization.a /usr/local/lib/libabsl_stacktrace.a /usr/local/lib/libabsl_graphcycles_internal.a /usr/local/lib/libabsl_symbolize.a /usr/local/lib/libabsl_malloc_internal.a /usr/local/lib/libabsl_debugging_internal.a /usr/local/lib/libabsl_demangle_internal.a /usr/local/lib/libabsl_time.a /usr/local/lib/libabsl_strings.a /usr/local/lib/libabsl_strings_internal.a /usr/local/lib/libabsl_throw_delegate.a /usr/local/lib/libabsl_base.a /usr/local/lib/libabsl_dynamic_annotations.a /usr/local/lib/libabsl_spinlock_wait.a -lpthread /usr/local/lib/libabsl_int128.a /usr/local/lib/libabsl_civil_time.a /usr/local/lib/libabsl_time_zone.a -lpthread && : CMakeFiles/cartographer_print_configuration.dir/cartographer/common/print_configuration_main.cc.o:在函数‘cartographer::common::PrintSubdictionaryById(cartographer::common::LuaParameterDictionary*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)’中: print_configuration_main.cc:(.text+0x2c3):对‘absl::ByChar::Find(std::basic_string_view<char, std::char_traits<char> >, unsigned long) const’未定义的引用 print_configuration_main.cc:(.text+0x84d):对‘absl::ByChar::Find(std::basic_string_view<char, std::char_traits<char> >, unsigned long) const’未定义的引用 CMakeFiles/cartographer_print_configuration.dir/cartographer/common/print_configuration_main.cc.o:在函数‘absl::strings_internal::Splitter<absl::ByChar, absl::SkipEmpty>::ConvertToContainer<std::vector<std::basic_string_view<char, std::char_traits<char> >, std::allocator<std::basic_string_view<char, std::char_traits<char> > > >, std::basic_string_view<char, std::char_traits<char> >, false>::operator()(absl::strings_internal::Splitter<absl::ByChar, absl::SkipEmpty> const&) const’中: print_configuration_main.cc:(.text._ZNK4absl16strings_internal8SplitterINS_6ByCharENS_9SkipEmptyEE18ConvertToContainerISt6vectorISt17basic_string_viewIcSt11char_traitsIcEESaISA_EESA_Lb0EEclERKS4_[_ZNK4absl16strings_internal8SplitterINS_6ByCharENS_9SkipEmptyEE18ConvertToContainerISt6vectorISt17basic_string_viewIcSt11char_traitsIcEESaISA_EESA_Lb0EEclERKS4_]+0x105):对‘absl::ByChar::Find(std::basic_string_view<char, std::char_traits<char> >, unsigned long) const’未定义的引用 print_configuration_main.cc:(.text._ZNK4absl16strings_internal8SplitterINS_6ByCharENS_9SkipEmptyEE18ConvertToContainerISt6vectorISt17basic_string_viewIcSt11char_traitsIcEESaISA_EESA_Lb0EEclERKS4_[_ZNK4absl16strings_internal8SplitterINS_6ByCharENS_9SkipEmptyEE18ConvertToContainerISt6vectorISt17basic_string_viewIcSt11char_traitsIcEESaISA_EESA_Lb0EEclERKS4_]+0x20d):对‘absl::ByChar::Find(std::basic_string_view<char, std::char_traits<char> >, unsigned long) const’未定义的引用 collect2: error: ld returned 1 exit status [3/104] Linking CXX executable cartographer.transform.rigid_transform_test FAILED: cartographer.transform.rigid_transform_test : && /usr/bin/c++ -O3 -DNDEBUG -rdynamic CMakeFiles/cartographer.transform.rigid_transform_test.dir/cartographer/transform/rigid_transform_test.cc.o -o cartographer.transform.rigid_transform_test libcartographer.a /usr/local/lib/libgmock_main.a /usr/local/lib/libgmock.a /usr/local/lib/libgtest.a -lpthread libcartographer_test_library.a libcartographer.a /usr/local/lib/libceres.a -lglog /usr/lib/x86_64-linux-gnu/libgflags.so.2.2.1 -lspqr -ltbb -ltbbmalloc -lcholmod -lccolamd -lcamd -lcolamd -lamd -llapack -lblas -lf77blas -latlas -lsuitesparseconfig -lrt -lcxsparse -llapack -lblas -lf77blas -latlas -lsuitesparseconfig -lrt -lcxsparse -lgomp -llua5.2 -lm -lboost_iostreams -lboost_regex -lglog /usr/lib/x86_64-linux-gnu/libgflags.so.2.2.1 -lcairo /usr/local/lib/libprotobuf.a /usr/local/lib/libabsl_leak_check.a /usr/local/lib/libabsl_hash.a /usr/local/lib/libabsl_bad_variant_access.a /usr/local/lib/libabsl_city.a /usr/local/lib/libabsl_raw_hash_set.a /usr/local/lib/libabsl_bad_optional_access.a /usr/local/lib/libabsl_hashtablez_sampler.a /usr/local/lib/libabsl_str_format_internal.a /usr/local/lib/libabsl_synchronization.a /usr/local/lib/libabsl_stacktrace.a /usr/local/lib/libabsl_graphcycles_internal.a /usr/local/lib/libabsl_symbolize.a /usr/local/lib/libabsl_malloc_internal.a /usr/local/lib/libabsl_debugging_internal.a /usr/local/lib/libabsl_demangle_internal.a /usr/local/lib/libabsl_time.a /usr/local/lib/libabsl_strings.a /usr/local/lib/libabsl_strings_internal.a /usr/local/lib/libabsl_throw_delegate.a /usr/local/lib/libabsl_base.a /usr/local/lib/libabsl_dynamic_annotations.a /usr/local/lib/libabsl_spinlock_wait.a -lpthread /usr/local/lib/libabsl_int128.a /usr/local/lib/libabsl_civil_time.a /usr/local/lib/libabsl_time_zone.a -lpthread /usr/local/lib/libgmock.a && : CMakeFiles/cartographer.transform.rigid_transform_test.dir/cartographer/transform/rigid_transform_test.cc.o:在函数‘std::ostream& cartographer::transform::operator<< <double>(std::ostream&, cartographer::transform::Rigid2<double> const&)’中: rigid_transform_test.cc:(.text._ZN12cartographer9transformlsIdEERSoS2_RKNS0_6Rigid2IT_EE[_ZN12cartographer9transformlsIdEERSoS2_RKNS0_6Rigid2IT_EE]+0x110):对‘absl::substitute_internal::SubstituteAndAppendArray(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::basic_string_view<char, std::char_traits<char> >, std::basic_string_view<char, std::char_traits<char> > const*, unsigned long)’未定义的引用 CMakeFiles/cartographer.transform.rigid_transform_test.dir/cartographer/transform/rigid_transform_test.cc.o:在函数‘std::ostream& cartographer::transform::operator<< <float>(std::ostream&, cartographer::transform::Rigid2<float> const&)’中: rigid_transform_test.cc:(.text._ZN12cartographer9transformlsIfEERSoS2_RKNS0_6Rigid2IT_EE[_ZN12cartographer9transformlsIfEERSoS2_RKNS0_6Rigid2IT_EE]+0x11c):对‘absl::substitute_internal::SubstituteAndAppendArray(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::basic_string_view<char, std::char_traits<char> >, std::basic_string_view<char, std::char_traits<char> > const*, unsigned long)’未定义的引用 CMakeFiles/cartographer.transform.rigid_transform_test.dir/cartographer/transform/rigid_transform_test.cc.o:在函数‘cartographer::transform::Rigid3<double>::DebugString[abi:cxx11]() const’中: rigid_transform_test.cc:(.text._ZNK12cartographer9transform6Rigid3IdE11DebugStringB5cxx11Ev[_ZNK12cartographer9transform6Rigid3IdE11DebugStringB5cxx11Ev]+0x20f):对‘absl::substitute_internal::SubstituteAndAppendArray(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::basic_string_view<char, std::char_traits<char> >, std::basic_string_view<char, std::char_traits<char> > const*, unsigned long)’未定义的引用 CMakeFiles/cartographer.transform.rigid_transform_test.dir/cartographer/transform/rigid_transform_test.cc.o:在函数‘cartographer::transform::Rigid3<float>::DebugString[abi:cxx11]() const’中: rigid_transform_test.cc:(.text._ZNK12cartographer9transform6Rigid3IfE11DebugStringB5cxx11Ev[_ZNK12cartographer9transform6Rigid3IfE11DebugStringB5cxx11Ev]+0x22b):对‘absl::substitute_internal::SubstituteAndAppendArray(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::basic_string_view<char, std::char_traits<char> >, std::basic_string_view<char, std::char_traits<char> > const*, unsigned long)’未定义的引用 CMakeFiles/cartographer.transform.rigid_transform_test.dir/cartographer/transform/rigid_transform_test.cc.o:在函数‘cartographer::transform::IsNearlyMatcherP2<cartographer::transform::Rigid2<float>, float>::gmock_Impl<cartographer::transform::Rigid2<float> const&>::FormatDescription[abi:cxx11](bool) const’中: rigid_transform_test.cc:(.text._ZNK12cartographer9transform17IsNearlyMatcherP2INS0_6Rigid2IfEEfE10gmock_ImplIRKS3_E17FormatDescriptionB5cxx11Eb[_ZNK12cartographer9transform17IsNearlyMatcherP2INS0_6Rigid2IfEEfE10gmock_ImplIRKS3_E17FormatDescriptionB5cxx11Eb]+0x17f):对‘absl::substitute_internal::SubstituteAndAppendArray(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::basic_string_view<char, std::char_traits<char> >, std::basic_string_view<char, std::char_traits<char> > const*, unsigned long)’未定义的引用 CMakeFiles/cartographer.transform.rigid_transform_test.dir/cartographer/transform/rigid_transform_test.cc.o:rigid_transform_test.cc:(.text._ZNK12cartographer9transform17IsNearlyMatcherP2INS0_6Rigid2IdEEdE10gmock_ImplIRKS3_E17FormatDescriptionB5cxx11Eb[_ZNK12cartographer9transform17IsNearlyMatcherP2INS0_6Rigid2IdEEdE10gmock_ImplIRKS3_E17FormatDescriptionB5cxx11Eb]+0x173): 跟着更多未定义的参考到 absl::substitute_internal::SubstituteAndAppendArray(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::basic_string_view<char, std::char_traits<char> >, std::basic_string_view<char, std::char_traits<char> > const*, unsigned long) collect2: error: ld returned 1 exit status [4/104] Linking CXX executable cartographer_pbstream FAILED: cartographer_pbstream : && /usr/bin/c++ -O3 -DNDEBUG -rdynamic CMakeFiles/cartographer_pbstream.dir/cartographer/io/pbstream_main.cc.o -o cartographer_pbstream libcartographer.a /usr/local/lib/libceres.a -lglog /usr/lib/x86_64-linux-gnu/libgflags.so.2.2.1 -lspqr -ltbb -ltbbmalloc -lcholmod -lccolamd -lcamd -lcolamd -lamd -llapack -lblas -lf77blas -latlas -lsuitesparseconfig -lrt -lcxsparse -llapack -lblas -lf77blas -latlas -lsuitesparseconfig -lrt -lcxsparse -lgomp -llua5.2 -lm -lboost_iostreams -lboost_regex -lglog /usr/lib/x86_64-linux-gnu/libgflags.so.2.2.1 -lcairo /usr/local/lib/libprotobuf.a /usr/local/lib/libabsl_leak_check.a /usr/local/lib/libabsl_hash.a /usr/local/lib/libabsl_bad_variant_access.a /usr/local/lib/libabsl_city.a /usr/local/lib/libabsl_raw_hash_set.a /usr/local/lib/libabsl_bad_optional_access.a /usr/local/lib/libabsl_hashtablez_sampler.a /usr/local/lib/libabsl_str_format_internal.a /usr/local/lib/libabsl_synchronization.a /usr/local/lib/libabsl_stacktrace.a /usr/local/lib/libabsl_graphcycles_internal.a /usr/local/lib/libabsl_symbolize.a /usr/local/lib/libabsl_malloc_internal.a /usr/local/lib/libabsl_debugging_internal.a /usr/local/lib/libabsl_demangle_internal.a /usr/local/lib/libabsl_time.a /usr/local/lib/libabsl_strings.a /usr/local/lib/libabsl_strings_internal.a /usr/local/lib/libabsl_throw_delegate.a /usr/local/lib/libabsl_base.a /usr/local/lib/libabsl_dynamic_annotations.a /usr/local/lib/libabsl_spinlock_wait.a -lpthread /usr/local/lib/libabsl_int128.a /usr/local/lib/libabsl_civil_time.a /usr/local/lib/libabsl_time_zone.a -lpthread && : libcartographer.a(histogram.cc.o):在函数‘cartographer::common::Histogram::ToString[abi:cxx11](int) const’中: histogram.cc:(.text+0x3f4):对‘absl::strings_internal::CatPieces[abi:cxx11](std::initializer_list<std::basic_string_view<char, std::char_traits<char> > >)’未定义的引用 histogram.cc:(.text+0xb60):对‘absl::strings_internal::AppendPieces(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::initializer_list<std::basic_string_view<char, std::char_traits<char> > >)’未定义的引用 collect2: error: ld returned 1 exit status [19/104] Building CXX object CMakeFiles/cart...unctions/landmark_cost_function_3d_test.cc.o ninja: build stopped: subcommand failed. u1804@u1804-Lenovo-Legion-R9000K2021H:~/study/cartographer_install$
最新发布
08-21
ubuntu@raspberrypi:~$ cat ~/PX4-Autopilot/build/px4_sitl_default/build_gazebo-classic/CMakeFiles/CMakeError.log Performing C SOURCE FILE Test CMAKE_HAVE_LIBC_PTHREAD failed with the following output: Change Dir: /home/ubuntu/PX4-Autopilot/build/px4_sitl_default/build_gazebo-classic/CMakeFiles/CMakeTmp Run Build Command(s):/bin/ninja cmTC_778f9 && [1/2] Building C object CMakeFiles/cmTC_778f9.dir/src.c.o [2/2] Linking C executable cmTC_778f9 FAILED: cmTC_778f9 : && /bin/cc -DCMAKE_HAVE_LIBC_PTHREAD CMakeFiles/cmTC_778f9.dir/src.c.o -o cmTC_778f9 && : /bin/ld: CMakeFiles/cmTC_778f9.dir/src.c.o: in function `main': src.c:(.text+0x48): undefined reference to `pthread_create' /bin/ld: src.c:(.text+0x50): undefined reference to `pthread_detach' /bin/ld: src.c:(.text+0x5c): undefined reference to `pthread_join' collect2: error: ld returned 1 exit status ninja: build stopped: subcommand failed. Source file was: #include <pthread.h> void* test_func(void* data) { return data; } int main(void) { pthread_t thread; pthread_create(&thread, NULL, test_func, NULL); pthread_detach(thread); pthread_join(thread, NULL); pthread_atfork(NULL, NULL, NULL); pthread_exit(NULL); return 0; } Determining if the function pthread_create exists in the pthreads failed with the following output: Change Dir: /home/ubuntu/PX4-Autopilot/build/px4_sitl_default/build_gazebo-classic/CMakeFiles/CMakeTmp Run Build Command(s):/bin/ninja cmTC_1816c && [1/2] Building C object CMakeFiles/cmTC_1816c.dir/CheckFunctionExists.c.o [2/2] Linking C executable cmTC_1816c FAILED: cmTC_1816c : && /bin/cc -DCHECK_FUNCTION_EXISTS=pthread_create CMakeFiles/cmTC_1816c.dir/CheckFunctionExists.c.o -o cmTC_1816c -lpthreads && : /bin/ld: cannot find -lpthreads collect2: error: ld returned 1 exit status ninja: build stopped: subcommand failed. 我的系统是aarch64 ubuntu20.04
08-10
ubuntu@ubuntu:~/PX4_Firmware$ make px4_sitl_default gazebo [0/724] git submodule Tools/sitl_gazebo [6/724] Performing configure step for 'sitl_gazebo' -- install-prefix: /usr/local -- The C compiler identification is GNU 7.5.0 -- The CXX compiler identification is GNU 7.5.0 -- Check for working C compiler: /usr/bin/cc -- Check for working C compiler: /usr/bin/cc -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done -- Check for working CXX compiler: /usr/bin/c++ -- Check for working CXX compiler: /usr/bin/c++ -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Detecting CXX compile features -- Detecting CXX compile features - done -- Performing Test COMPILER_SUPPORTS_CXX17 -- Performing Test COMPILER_SUPPORTS_CXX17 - Success -- Performing Test COMPILER_SUPPORTS_CXX14 -- Performing Test COMPILER_SUPPORTS_CXX14 - Success -- Performing Test COMPILER_SUPPORTS_CXX11 -- Performing Test COMPILER_SUPPORTS_CXX11 - Success -- Performing Test COMPILER_SUPPORTS_CXX0X -- Performing Test COMPILER_SUPPORTS_CXX0X - Success -- Using C++17 compiler -- Looking for pthread.h -- Looking for pthread.h - found -- Performing Test CMAKE_HAVE_LIBC_PTHREAD -- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed -- Looking for pthread_create in pthreads -- Looking for pthread_create in pthreads - not found -- Looking for pthread_create in pthread -- Looking for pthread_create in pthread - found -- Found Threads: TRUE -- Found Boost: /usr/include (found suitable version "1.65.1", minimum required is "1.58") found components: system thread filesystem chrono date_time atomic CMake Error at CMakeLists.txt:32 (find_package): By not providing "Findgazebo.cmake" in CMAKE_MODULE_PATH this project has asked CMake to find a package configuration file provided by "gazebo", but CMake did not find one. Could not find a package configuration file provided by "gazebo
03-17
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

10km

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值