绘图知识(二):为客户端窗口设置缓冲区

本文介绍了SymbianOS中缓冲区容量的变化及其调整方法。从GT版到60系列,缓冲区容量从640字节提升到了6400字节,并且允许应用程序动态调整缓冲区大小。通过示例代码展示了如何使用ConstructL函数设置更大的缓冲区容量。
在Symbian OS的GT版中,缓冲区容量是固定的640字节。60系列将缓冲区提高到了6400字节,并支持应用程序改变该缓冲区的容量。当绘制过程由许多绘制函数或大量文本组成时,大容量的缓冲区在各种应用中特别有价值。闪烁淡出中的情况就是如此。可以通过应用程序用户界面类中的ConstructL来改变缓冲区的容量。

ConstructL来改变缓冲区的容量。

void CMyAppUi::ConstructL()
{
BaseConstructL();
//调用BaseContructL后可以设置WS缓冲区大小
RWsSession &ws = iEikonEnv->WsSession();
TInt bufsize = 10000;
ws.SetBufferSizeL(bufsize);
//继续进行一般的app UI构建
iMyView = new ( ELeave ) CMyMainView;
iMyView->ConstructL( ClientRect() );
AddToStackL( iMyView );
}


 
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
在构建Cartographer时,如果遇到链接错误如`undefined reference to 'absl::substitute_internal::SubstituteAndAppendArray'`,这通常表明编译器未能找到或正确链接Google的Abseil。此类问题在Ubuntu 20.04与ROS Noetic环境下尤为常见。 ### 原因分析 该问题的核心原因在于Abseil的版本不匹配或未被正确链接。Cartographer依赖于特定版本的Abseil(如`lts_20211102`),如果系统中未安装该版本,或者CMake未能正确识别其路径,将导致链接失败。此外,某些情况下即使安装了正确的版本,也可能因构建缓存残留或依赖项缺失而引发类似错误。 ### 解决方法 #### 1. 安装指定版本的Abseil Cartographer项目通常提供了一个脚本来简化Abseil的安装过程。执行以下命令可以下载并安装与Cartographer兼容的Abseil版本: ```bash cd ~/cartographer_ws/src/cartographer/scripts ./install_abseil.sh ``` 该脚本会将Abseil安装到本地路径,避免与系统中其他版本冲突[^3]。 #### 2. 清理构建缓存并重新构建 旧的构建缓存可能导致编译器尝试链接错误的Abseil版本或未更新的符号表。执行以下命令清理并重新构建: ```bash cd ~/cartographer_ws rm -rf build devel catkin_make_isolated --install --use-ninja ``` #### 3. 显式链接Abseil 在CMake配置中,确保`find_package(absl REQUIRED)`被正确调用,并且目标文件显式链接了所需的Abseil组件。例如,在`CMakeLists.txt`中添加: ```cmake set(absl_LIBRARIES absl::algorithm absl::base absl::debugging absl::flat_hash_map absl::memory absl::meta absl::numeric absl::str_format absl::strings absl::synchronization absl::time absl::utility ) target_link_libraries(your_target_name ${absl_LIBRARIES}) ``` 这可以确保所有必要的Abseil模块都被正确链接[^3]。 #### 4. 检查Abseil的安装路径 如果Abseil被安装到非标准路径,可以在构建时通过`-DABSL_ROOT`指定其位置: ```bash catkin_make_isolated --install --use-ninja -DABSL_ROOT=/path/to/abseil ``` #### 5. 验证Abseil是否正确安装 可以通过一个简单的测试程序验证Abseil是否正确安装并链接: ```cpp #include "absl/strings/str_cat.h" #include <iostream> int main() { std::string result = absl::StrCat("Hello, ", "Abseil!"); std::cout << result << std::endl; return 0; } ``` 使用以下命令编译并链接Abseil: ```bash g++ test_abseil.cpp -o test_abseil -I/path/to/abseil -L/path/to/abseil/build -labsl_strings ``` 如果程序能正常运行并输出`Hello, Abseil!`,则表明Abseil已正确安装和链接。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值