gcc/g++版本对引用第三方库的影响

这两天因为公司的nfs访问机制升级,要求把个人电脑的linux内核进行升级,无意中动了gcc的版本,原来是gcc 5.4.0, 现在变成了gcc 7.5.0,当然这是后来代码编译出现问题才最后发现的,而且在这个坑里足足待了2个小时。我的青春啊!!!

事件经过:发现基于ros+pcl的代码编译不过,报错如下:

[ 33%] Linking CXX executable /home/tusimple/opt/catkin_ws/devel/lib/point_cloud_analyse/point_cloud_analyse
CMakeFiles/point_cloud_analyse.dir/src/utility.cpp.o:(.data.rel.ro._ZTVN3pcl6search6SearchINS_9PointXYZIEEE[_ZTVN3pcl6search6SearchINS_9PointXYZIEEE]+0x20):对‘pcl::search::Search<pcl::PointXYZI>::getName[abi:cxx11]() const’未定义的引用
CMakeFiles/point_cloud_analyse.dir/src/utility.cpp.o:(.data.rel.ro._ZTVN3pcl6search6KdTreeINS_9PointXYZIENS_11KdTreeFLANNIS2_N5flann9L2_SimpleIfEEEEEE[_ZTVN3pcl6search6KdTreeINS_9PointXYZIENS_11KdTreeFLANNIS2_N5flann9L2_SimpleIfEEEEEE]+0x20):对‘pcl::search::Search<pcl::PointXYZI>::getName[abi:cxx11]() const’未定义的引用
collect2: error: ld returned 1 exit status

额!!链接出错,难道是pcl库木有找到吗?好吧, 给CMakeLists.txt加些打印信息:

MESSAGE( STATUS "PCL_INCLUDE_DIRS = ${PCL_INCLUDE_DIRS}.")

MESSAGE( STATUS "PCL_LIBRARY_DIRS = ${PCL_LIBRARY_DIRS}.")

MESSAGE( STATUS "PCL_DEFINITIONS = ${PCL_DEFINITIONS}.")

MESSAGE( STATUS "PCL_LIBRARIES = ${PCL_LIBRARIES}.")

然后运行catkin_make,查看结果:

-- Found PCL: pcl_common;pcl_octree;pcl_io;pcl_kdtree;pcl_search;pcl_sample_consensus;pcl_filters;pcl_features;pcl_ml;pcl_segmentation;pcl_surface;pcl_registration;pcl_recognition;pcl_keypoints;pcl_visualization;pcl_tracking;pcl_stereo;pcl_outofcore;pcl_people;/usr/lib/x86_64-linux-gnu/libboost_system.so;/usr/lib/x86_64-linux-gnu/libboost_filesystem.so;/usr/lib/x86_64-linux-gnu/libboost_date_time.so;/usr/lib/x86_64-linux-gnu/libboost_iostreams.so;/usr/lib/x86_64-linux-gnu/libboost_serialization.so;/usr/lib/x86_64-linux-gnu/libboost_regex.so;optimized;/usr/lib/x86_64-linux-gnu/libqhull.so;debug;/usr/lib/x86_64-linux-gnu/libqhull.so;/usr/lib/libOpenNI.so;vtkChartsCore;vtkCommonColor;vtkCommonDataModel;vtkCommonMath;vtkCommonCore;vtksys;vtkCommonMisc;vtkCommonSystem;vtkCommonTransforms;vtkInfovisCore;vtkFiltersExtraction;vtkCommonExecutionModel;vtkFiltersCore;vtkFiltersGeneral;vtkCommonComputationalGeometry;vtkFiltersStatistics;vtkImagingFourier;vtkImagingCore;vtkalglib;vtkRenderingContext2D;vtkRenderingCore;vtkFiltersGeometry;vtkFiltersSources;vtkRenderingFreeType;/usr/lib/x86_64-linux-gnu/libfreetype.so;/usr/lib/x86_64-linux-gnu/libz.so;vtkftgl;vtkFiltersModeling;vtkImagingSources;vtkInteractionStyle;vtkInteractionWidgets;vtkFiltersHybrid;vtkImagingGeneral;vtkImagingHybrid;vtkIOImage;vtkDICOMParser;vtkIOCore;vtkmetaio;/usr/lib/x86_64-linux-gnu/libjpeg.so;/usr/lib/x86_64-linux-gnu/libpng.so;/usr/lib/x86_64-linux-gnu/libtiff.so;vtkRenderingAnnotation;vtkImagingColor;vtkRenderingVolume;vtkIOGeometry;/usr/lib/x86_64-linux-gnu/libjsoncpp.so;vtkIOLegacy;vtkIOPLY;vtkRenderingLOD;vtkViewsContext2D;vtkViewsCore;vtkRenderingContextOpenGL;vtkRenderingOpenGL;vtkRenderingQt;vtkFiltersTexture;vtkGUISupportQt;vtkRenderingLabel;FLANN::FLANN (Required is at least version "1.11")
-- PCL_INCLUDE_DIRS = /usr/local/include/pcl-1.11;/usr/include/eigen3;/usr/include;/usr/include/ni;/usr/include/vtk-6.2;/usr/include/freetype2;/usr/include/x86_64-linux-gnu;/usr/include/jsoncpp.
-- PCL_LIBRARY_DIRS = /usr/local/lib.
-- PCL_DEFINITIONS = -DDISABLE_PCAP;-DDISABLE_PNG;-DDISABLE_LIBUSB_1_0.
-- PCL_LIBRARIES = pcl_common;pcl_octree;pcl_io;pcl_kdtree;pcl_search;pcl_sample_consensus;pcl_filters;pcl_features;pcl_ml;pcl_segmentation;pcl_surface;pcl_registration;pcl_recognition;pcl_keypoints;pcl_visualization;pcl_tracking;pcl_stereo;pcl_outofcore;pcl_people;/usr/lib/x86_64-linux-gnu/libboost_system.so;/usr/lib/x86_64-linux-gnu/libboost_filesystem.so;/usr/lib/x86_64-linux-gnu/libboost_date_time.so;/usr/lib/x86_64-linux-gnu/libboost_iostreams.so;/usr/lib/x86_64-linux-gnu/libboost_serialization.so;/usr/lib/x86_64-linux-gnu/libboost_regex.so;optimized;/usr/lib/x86_64-linux-gnu/libqhull.so;debug;/usr/lib/x86_64-linux-gnu/libqhull.so;/usr/lib/libOpenNI.so;vtkChartsCore;vtkCommonColor;vtkCommonDataModel;vtkCommonMath;vtkCommonCore;vtksys;vtkCommonMisc;vtkCommonSystem;vtkCommonTransforms;vtkInfovisCore;vtkFiltersExtraction;vtkCommonExecutionModel;vtkFiltersCore;vtkFiltersGeneral;vtkCommonComputationalGeometry;vtkFiltersStatistics;vtkImagingFourier;vtkImagingCore;vtkalglib;vtkRenderingContext2D;vtkRenderingCore;vtkFiltersGeometry;vtkFiltersSources;vtkRenderingFreeType;/usr/lib/x86_64-linux-gnu/libfreetype.so;/usr/lib/x86_64-linux-gnu/libz.so;vtkftgl;vtkFiltersModeling;vtkImagingSources;vtkInteractionStyle;vtkInteractionWidgets;vtkFiltersHybrid;vtkImagingGeneral;vtkImagingHybrid;vtkIOImage;vtkDICOMParser;vtkIOCore;vtkmetaio;/usr/lib/x86_64-linux-gnu/libjpeg.so;/usr/lib/x86_64-linux-gnu/libpng.so;/usr/lib/x86_64-linux-gnu/libtiff.so;vtkRenderingAnnotation;vtkImagingColor;vtkRenderingVolume;vtkIOGeometry;/usr/lib/x86_64-linux-gnu/libjsoncpp.so;vtkIOLegacy;vtkIOPLY;vtkRenderingLOD;vtkViewsContext2D;vtkViewsCore;vtkRenderingContextOpenGL;vtkRenderingOpenGL;vtkRenderingQt;vtkFiltersTexture;vtkGUISupportQt;vtkRenderingLabel;FLANN::FLANN.

打印信息表明:pcl库是找到了

那为何还提示被调用的函数未定义呢?难道是编译器换名导致的。

g++ -version查看一下,果真版本变了。

ll /usr/bin/ | grep g++ ,发现gcc(软链接)指向了gcc-7,将gcc g++修改回指向gcc-5,然后在编译,ok通过。

思考:

因为我的pcl库是用g++5.4.0编译的,而当前应用程序用的g++7.5.0,所以会导致ABI不兼容,故开发程序要保持用的库在abi级别上兼容,最简单的方法就是保持编译器版本一致。

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值