undefined reference to `std::cout’
该报错一般原因都是因为编译器问题,例如使用gcc命令编译链接C++文件
gcc -o test ./test.cpp
从源代码文件到可执行文件的过程经过四个环节:预处理,编译,汇编,链接
gcc可以进行C++文件的预处理,编译,汇编,但是不会主动链接iostream等C++库,所以才会出现这个error
解决办法:
方法一:使用g++命令进行编译
g++ -o test ./test.cpp
方法二:在gcc后添加链接参数 -lstdc++
gcc -o test ./test.cpp -lstdc++
undefined reference to `cv::xxxx
该报错是指链接器ld无法找到cv的库文件,
解决方法:
gcc ./test.cpp -lstdc++ -lopencv_core -lopencv_highgui -lopencv_imgcodecs
# 或者
g++ ./test.cpp -lopencv_core -lopencv_highgui -lopencv_imgcodecs
注意,cv的库文件是按模块分开的,所以链接也是按模块分开的,cv::Mat这种都是在opencv_core中,imread,imshow这种都是在opencv_highgui中,cvtColor这种都是在opencv_imgproc中。
error adding symbols: DSO missing from command line
该报错的原因是因为链接时添加了A库的链接选项,A库又需要链接B库,但是没有添加B库的链接选项,这种情况下就会出现这个error
解决方法:
看这个报错前面是哪个库,然后把这个库也添加到链接选项中。
eg:
/usr/bin/ld: /usr/local/lib/libopencv_imgcodecs.so.408: error adding symbols: DSO missing from command line
这个报错就是指libopencv_imgcodecs库没有添加到选项,在后面添加-lopencv_imgcodecs选项即可。
如果再报错,那需要查看一下自己的系统上有没有这个库文件,或者这个库文件是否在链接查找路径里面,如果库文件存在,但是没在查找路径里,可以使用-L your_file_path来临时添加查找路径。
如果想要永久添加查找路径,可以在环境变量中添加LD_LIBRARY_PATH环境变量,也可以在/etc/ld.so.conf.d中添加一个conf文件,将路径存储到里面
关于链接
GCC是由GNU开发的编译器,GCC不仅仅是一个独立的编译工具,还是GNU整个工程的一部分,GNU中的其他软件包括:GNU C语言库glibc,GNU调试工具gdb,GNU二进制工具链binutils(包括:汇编工具as,链接工具ld,目标文件分析工具objdump,objcopy,符号展示工具nm,符号清理工具strip等)。
gcc编译生成可执行文件的过程就是调用这个工具链中其他工具协作完成的过程。像gcc一样,其他工具也可以输入参数,像本文上面提到的-L path和-llibname这种都是传递给链接器ld的参数,通过向这些工具传递参数,我们的编译过程可以更加定制化。
编译的过程一旦出了error,也可以通过参数进行挽救,先根据报错排查是哪个阶段出了问题,再排查根据阶段排查代码问题究竟是逻辑问题还是语法问题。
- 出现在预处理阶段的error一般都是宏出现了问题,
- 出现在编译阶段的有可能是拼写问题,也有可能是逻辑问题,大多数的报错都是出现在这个阶段,这个阶段负责进行语法分析和词法分析。
- 出现在链接阶段的error一般都是跟其他库有关,例如缺库或者库中没有该reference的定义等。