首先,确保自己安装了一个比较好的编程工具,本人推荐Kdevelop、CLion,程序跳转等都没有问题,可以方便查找问题的所在,同时也可以查看文件路径书写是否出现异常等。

一、确保函数和路径没有任何问题

利用编译工具,首先查看一下报错误的.cpp文件、.h文件和相应的函数是否完整,是不是没有把头文件包含进入cpp文件中,如果已经包含了查看一下路径有没有任何的问题,确保可以跳转过去,特别是针对多个文件夹的文件,.cpp 文件中要包含.h文件。如果发现文件无法跳转但是.h文件确实还存在,就是文件的路径写的有些问题,查看一下Include “…/XXX/XX.h”;(建议使用这种其中:…/ 表示跳转到上一级的文件夹内)和include <XX.h>,这两个的使用有一定的差别,大家可以需要注意下。
对于两者区别“”和<>可以查看博客:“”和<>区别 ,简要的介绍。
#include 搜索路径介绍
例:执行程序目录即为当前目录

 如果在程序中指定文件目录为"filename",则文件应该在~/Documents/codes/CCodes如果在程序中指定文件目录为"…/filename",则文件应该在~/Documents/codes

针对webots,还需要书写makefile文件,确保已经把所有的文件夹的路径和文件到都已经包含进去类。如果没有包含的话,会出现错误的undefined reference to。对于makefile文件的编写,大家可以查看一下博客:编写makefile文件
查看一下目标函数是不是真的没有定义,查看一下是不是有问题,没有写全或者漏写了。
如果都没有问题可能是库的链接有问题。
最后一个可能就是 在.cpp文件中不能将类的实现变成inline函数,否则也会出现这种错误。

二、库的链接问题

大家先了解一下Linux gcc链接规则:
链接的时候查找顺序是:

1. -L 指定的路径, 从左到右依次查找
2. 由环境变量 LIBRARY_PATH 指定的路径,使用":"分割从左到右依次查找
3. /etc/ld.so.conf 指定的路径顺序
4. /lib 和 /usr/lib (64位下是/lib64和/usr/lib64)

动态库调用的查找顺序:

1. ld的-rpath参数指定的路径, 这是写死在代码中的
2. ld脚本指定的路径
3.LD_LIBRARY_PATH 指定的路径
4./etc/ld.so.conf 指定的路径
5./lib和/usr/lib(64位下是/lib64和/usr/lib64)

一般情况链接的时候我们采用-L的方式指定查找路径, 调用动态链接库的时候采用LD_LIBRARY_PATH的方式指定链接路径。
另外注意一个问题,就是只要查找到第一个就会返回,后面的不会再查找. 比如-L./A -L./B -lx 在A中有libx.a B中有libx.a和libx.so, 这个时候会使用在./A的libx.a 而不会遵循动态库优先的原则,因为./A是先找到的,并且没有同名动态库存在。
对于动态链接库,实际的符号定位是在运行期进行的.在编译.so的时候,如果没有把它需要的库和他一起进行联编,比如libx.so 需要使用uldict, 但是忘记在编译libx.so的时候加上-luldict的话,在编译libx.so的时候不会报错,因为这个时候libx.so被认为是一个库,它里面存在一些不知道具体实现的符号是合法的,是可以在运行期指定或者编译另外的二进制程序的时候指定。

如果是采用 g++ -Lpath -lx 的方式进行编译,链接器会发现所需要的uldict的符号表找不到从而报错,但是如果是程序采用dlopen的方式载入,由于是运行期,这个程序在这个地方就直接运行报错了.另外还有一种情况就是一个对外的接口在动态库中已经声明定义了,但是忘记实现了,这个时候也会产生类似的错误。

如果在运行期报出这样的错误,就要注意是否是由于某些库没有链接进来或者某些接口没有实现的原因产生。
非常感谢博客博主:woshare 的关于库的分享。
下面两个博客关于动态和静态链接库的介绍,以及常见的错误方式如下:

  1. 链接库文件出现“undefined reference to" 问题的解决方法
  2. Linux下编译多个不同目录下的文件以及静态库、动态库的使用介绍

库链接错误原因总结:

1.没有指定对应的库(.o/.a/.so) 使用了库中定义的实体,但没有指定库(-lXXX)或者没有指定库路径(-LYYY),会导致该错误,
2.连接库参数的顺序不对 在默认情况下,对于-l 使用库的要求是越是基础的库越要写在后面,无论是静态还动态
3.gcc/ld 版本不匹配 gcc/ld的版本的兼容性问题,由于gcc2 到 gcc3大版本的兼容性存在问题(其实gcc3.2到3.4也一定程度上存在这样的问题) 当在高版本机器上使用低版本的机器就会导致这样的错误, 这个问题比较常见在32位的环境上, 另外就在32位环境不小心使用了64位的库或者反过来64位环境使用了32位的库.
4.C/C++相互依赖和链接 gcc和g++编译结果的混用需要保证能够extern “C” 两边都可以使用的接口,在我们的64位环境中gcc链接g++的库还需要加上 -lstdc++,具体见对于混合编译的说明
5.运行期报错 这个问题基本上是由于程序使用了dlopen方式载入.so, 但.so没有把所有需要的库都链接上,具体参加上文中对于静态库和动态库混合使用的说明

Linux下,编译程序遇到“undefined reference to XXX” 报错(可针对webots的编译,不同的文件夹下面不同的cpp,.h文件)相关推荐

  1. linux下安装mongodb,以及解决安装报错问题

    linux下安装mongodb,以及解决安装报错问题 参考文章: (1)linux下安装mongodb,以及解决安装报错问题 (2)https://www.cnblogs.com/tongl/p/71 ...

  2. error: undefined reference to `calculate()`报错

    在调用xx.h和xx.c中的函数,比如calculate()时 如下: #include "xx.h" int t; int result = calculate(t); 此时报错 ...

  3. redis安装 linux make,linux下安装redis执行make的时候报错

    今天安装了CentOS7 1708 在安装redis时报错  make[1]: *** [adlist.o] 错误 127 因为Redis是C实现的,需要gcc来进行编译,所以原因是系统未安装gcc, ...

  4. 【GCC编译优化系列】GCC链接失败的错误提示 undefined reference to ‘xxx‘ 可能还有一种情况你没注意到?

    文章目录 1 写在前面 2 问题描述 2.1 问题现场 2.2 快速排查 2.3 判断问题 3 知识点突破 3.1 场景复现 3.2 深入分析 3.3 涨点新知识 4 经验总结 5 参考链接 6 更多 ...

  5. linux 线程操作问题undefined reference to ‘pthread_create‘的解决办法(cmake)

    linux 线程操作问题undefined reference to 'pthread_create'的解决办法(cmake) 参考文章: (1)linux 线程操作问题undefined refer ...

  6. c++中报错error: undefined reference to `xxx‘

    在c++中报错error: undefined reference to `xxx',意思是引用了未定义的方法.造成这个问题有很多原因,这里介绍我遇到的两个问题. 1.未引用对应的头文件或者是在头文件 ...

  7. C/C++ “undefined reference to XXX“问题总结

    这里看到一篇总结非常全面的文章,记录一下: "undefined reference to XXX"问题总结

  8. qt5.3.2移植到arm上出undefined reference to '__sync_sub_and_fetch_4的错

    qt5.3.2移植到arm上出undefined reference to '__sync_sub_and_fetch_4的错.解决办法如下, 使用工具:GCC4.4.1 QT源码:qt5.3.2 前 ...

  9. Anaconda下激活环境conda activate xxx 报错

    Anaconda下激活环境conda activate xxx 报错 报错 原因 解决 报错 在Anaconda下安装完python环境后,在激活python2.7环境时conda activate报 ...

最新文章

  1. python转csv_python脚本如何将Excel文件转为csv文件(代码)
  2. .git文件夹_Git服务器安装- windows
  3. 老李推荐:第5章5节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 获取系统服务引用 1...
  4. Singleton模式笔记
  5. 同一Word文档不同尺寸(纸张)页面的混排方法
  6. java ee jms_Java EE6事件:JMS的轻量级替代品
  7. 关于css的一切(updating...)
  8. 敏捷开发用户故事系列之六:用户故事的产生与组织结构
  9. OCR文字识别技术总结(四)
  10. hiho一下 第五十周 (求欧拉路径)
  11. MCP3421高精度ADC转换器
  12. xp系统可用的远程投屏软件_市面上支持WindowsXP系统的无线投屏器是越来越少了?...
  13. 集成运算放大器之积分电路搭建
  14. 2023年全国最新交安安全员精选真题及答案4
  15. HTML之设置背景、边框、边距和补白
  16. 公共钥匙盒 Java算法
  17. 《Python编程:从入门到实践》读书笔记——第5章:if语句
  18. 利用opencv进行图片水印消除
  19. 4-5课:为什么每个程序员都要拜四阿哥?要解决bug(八阿哥)
  20. 驾考:科一知识点总结

热门文章

  1. 毕马威加入“华尔街区块链联盟”
  2. 我读过的最好的epoll讲解--转自知乎
  3. python 按照顺序读取文件夹中的图片名称
  4. 小程序好看的渐变色按钮
  5. JavaScript 取随机数
  6. 【C语言】指针Pointer初阶(1)
  7. 抛硬币的两种思维方式
  8. linux top参数分析,Linux的top命令(分析篇)
  9. MapReduce框架
  10. 360手机刷机:360N6pro刷机