C++ 编译过程遇到问题快速查找解决

2023-05-16

一、在使用cmake创建项目,并在make过程中,遇到以下问题的,这里提供定位问题并解决的相关参考

问题描述:make过程出现如下报错——

[ 82%] Building CXX object CMakeFiles/dwsr_wholes.dir/src/yolov5.cpp.o
[ 88%] Linking CXX executable dwsr_wholes

CMakeFiles/...dir/src/yolov5.cpp.o: In function `cv::Rect_<int>::Rect_(int, int, int, int)':
../../include/common_yolo.h:14: multiple definition of `get_rect(cv::Mat&, float*)'
CMakeFiles/...dir/src/main.cpp.o:../../include/common_yolo.h:14: first defined here
CMakeFiles/...dir/src/yolov5.cpp.o: In function `iou(float*, float*)':
../../include/common_yolo.h:41: multiple definition of `iou(float*, float*)'
CMakeFiles/...dir/src/main.cpp.o:../../include/common_yolo.h:41: first defined here
CMakeFiles/...dir/src/yolov5.cpp.o: In function `cmp(Yolo::Detection const&, Yolo::Detection const&)':
../../include/common_yolo.h:56: multiple definition of `cmp(Yolo::Detection const&, Yolo::Detection const&)'
CMakeFiles/...dir/src/main.cpp.o:../../include/common_yolo.h:56: first defined here
CMakeFiles/...dir/src/yolov5.cpp.o: In function `nms(std::vector<Yolo::Detection, std::allocator<Yolo::Detection> >&, float*, float, float)':
../../include/common_yolo.h:60: multiple definition of `nms(std::vector<Yolo::Detection, std::allocator<Yolo::Detection> >&, float*, float, float)'
CMakeFiles/...dir/src/main.cpp.o:../../include/common_yolo.h:60: first defined here
CMakeFiles/...dir/src/yolov5.cpp.o: In function `loadWeights(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
../../include/common_yolo.h:89: multiple definition of `loadWeights(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
CMakeFiles/...dir/src/main.cpp.o:../../include/common_yolo.h:89: first defined here
CMakeFiles/...dir/src/yolov5.cpp.o: In function `addBatchNorm2d(nvinfer1::INetworkDefinition*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, nvinfer1::Weights, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, nvinfer1::Weights> > >&, nvinfer1::ITensor&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, float)':
../../include/common_yolo.h:127: multiple definition of `addBatchNorm2d(nvinfer1::INetworkDefinition*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, nvinfer1::Weights, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, nvinfer1::Weights> > >&, nvinfer1::ITensor&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, float)'
CMakeFiles/...dir/src/main.cpp.o:../../include/common_yolo.h:127: first defined here
CMakeFiles/...dir/src/yolov5.cpp.o: In function `convBlock(nvinfer1::INetworkDefinition*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, nvinfer1::Weights, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, nvinfer1::Weights> > >&, nvinfer1::ITensor&, int, int, int, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
../../include/common_yolo.h:160: multiple definition of `convBlock(nvinfer1::INetworkDefinition*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, nvinfer1::Weights, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, nvinfer1::Weights> > >&, nvinfer1::ITensor&, int, int, int, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
CMakeFiles/...dir/src/main.cpp.o:../../include/common_yolo.h:160: first defined here
CMakeFiles/...dir/src/yolov5.cpp.o: In function `focus(nvinfer1::INetworkDefinition*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, nvinfer1::Weights, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, nvinfer1::Weights> > >&, nvinfer1::ITensor&, int, int, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
../../include/common_yolo.h:178: multiple definition of `focus(nvinfer1::INetworkDefinition*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, nvinfer1::Weights, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, nvinfer1::Weights> > >&, nvinfer1::ITensor&, int, int, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
CMakeFiles/...dir/src/main.cpp.o:../../include/common_yolo.h:178: first defined here
CMakeFiles/...dir/src/yolov5.cpp.o: In function `bottleneck(nvinfer1::INetworkDefinition*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, nvinfer1::Weights, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, nvinfer1::Weights> > >&, nvinfer1::ITensor&, int, int, bool, int, float, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
../../include/common_yolo.h:189: multiple definition of `bottleneck(nvinfer1::INetworkDefinition*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, nvinfer1::Weights, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, nvinfer1::Weights> > >&, nvinfer1::ITensor&, int, int, bool, int, float, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
CMakeFiles/...dir/src/main.cpp.o:../../include/common_yolo.h:189: first defined here
CMakeFiles/...dir/src/yolov5.cpp.o: In function `bottleneckCSP(nvinfer1::INetworkDefinition*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, nvinfer1::Weights, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, nvinfer1::Weights> > >&, nvinfer1::ITensor&, int, int, int, bool, int, float, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
../../include/common_yolo.h:199: multiple definition of `bottleneckCSP(nvinfer1::INetworkDefinition*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, nvinfer1::Weights, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, nvinfer1::Weights> > >&, nvinfer1::ITensor&, int, int, int, bool, int, float, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
CMakeFiles/...dir/src/main.cpp.o:../../include/common_yolo.h:199: first defined here
CMakeFiles/...dir/src/yolov5.cpp.o: In function `C3(nvinfer1::INetworkDefinition*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, nvinfer1::Weights, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, nvinfer1::Weights> > >&, nvinfer1::ITensor&, int, int, int, bool, int, float, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
../../include/common_yolo.h:222: multiple definition of `C3(nvinfer1::INetworkDefinition*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, nvinfer1::Weights, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, nvinfer1::Weights> > >&, nvinfer1::ITensor&, int, int, int, bool, int, float, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
CMakeFiles/...dir/src/main.cpp.o:../../include/common_yolo.h:222: first defined here
CMakeFiles/...dir/src/yolov5.cpp.o: In function `SPP(nvinfer1::INetworkDefinition*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, nvinfer1::Weights, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, nvinfer1::Weights> > >&, nvinfer1::ITensor&, int, int, int, int, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
../../include/common_yolo.h:239: multiple definition of `SPP(nvinfer1::INetworkDefinition*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, nvinfer1::Weights, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, nvinfer1::Weights> > >&, nvinfer1::ITensor&, int, int, int, int, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
CMakeFiles/...dir/src/main.cpp.o:../../include/common_yolo.h:239: first defined here
CMakeFiles/...dir/src/yolov5.cpp.o: In function `SPPF(nvinfer1::INetworkDefinition*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, nvinfer1::Weights, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, nvinfer1::Weights> > >&, nvinfer1::ITensor&, int, int, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
../../include/common_yolo.h:260: multiple definition of `SPPF(nvinfer1::INetworkDefinition*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, nvinfer1::Weights, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, nvinfer1::Weights> > >&, nvinfer1::ITensor&, int, int, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
CMakeFiles/...dir/src/main.cpp.o:../../include/common_yolo.h:260: first defined here
CMakeFiles/...dir/src/yolov5.cpp.o: In function `getAnchors(std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, nvinfer1::Weights, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, nvinfer1::Weights> > >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
../../include/common_yolo.h:279: multiple definition of `getAnchors(std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, nvinfer1::Weights, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, nvinfer1::Weights> > >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
CMakeFiles/...dir/src/main.cpp.o:../../include/common_yolo.h:279: first defined here
CMakeFiles/...dir/src/yolov5.cpp.o: In function `addYoLoLayer(nvinfer1::INetworkDefinition*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, nvinfer1::Weights, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, nvinfer1::Weights> > >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<nvinfer1::IConvolutionLayer*, std::allocator<nvinfer1::IConvolutionLayer*> >)':
../../include/common_yolo.h:291: multiple definition of `addYoLoLayer(nvinfer1::INetworkDefinition*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, nvinfer1::Weights, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, nvinfer1::Weights> > >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<nvinfer1::IConvolutionLayer*, std::allocator<nvinfer1::IConvolutionLayer*> >)'
CMakeFiles/...dir/src/main.cpp.o:../../include/common_yolo.h:291: first defined here
/usr/bin/ld: error in /usr/bin/c++(.eh_frame); no .eh_frame_hdr table will be created.
collect2: error: ld returned 1 exit status
CMakeFiles/...dir/build.make:1792: recipe for target '..' failed
make[2]: *** [..] Error 1
CMakeFiles/Makefile2:80: recipe for target 'CMakeFiles/...dir/all' failed
make[1]: *** [CMakeFiles/...dir/all] Error 2
Makefile:86: recipe for target 'all' failed
make: *** [all] Error 2

这个日志中有提到 多次定义,那么来找下那里重复定义了

 ***.h:14: multiple definition of `get_rect(cv::Mat&, float*)'

***.h:14: first defined here

 常规方法

使用如下代码,在定义头文件的时候加在首尾

#ifndef ***_H
#define ***_H
/*
代码
*/
#endif

如果得不到解决,并且在全局中搜多不到对应函数的多次定义记录,那么可能遇到的问题是多次加载某个定义,使用以下方法

解决方案:

搜索对应函数所在的文件名,“common_yolo.h”

这个时候回发现,在Makefile过称的中间文件有记录“common_yolo.h”相应的加载记录,可以定位到加载了几次,通过这个方法,自己去确认是否有重复加载的操作,去除掉之后,可以解决问题。

核心原因,多次定义原因在于嵌套定义,新定义的头文件最好不要在头文件里面进行include,同时严格遵照编码准则,方法定义写在cpp里面,不要把方法直接写在头文件里面。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 编译过程遇到问题快速查找解决 的相关文章

随机推荐