当前位置: 首页 > web >正文

C++ 编译报错 undefined reference 找不到引用的问题解决思路

前言

undefined reference 算是一个很常见的编译报错了,其实本质是发生在链接阶段也不是编译的时候。
下面整理一下遇到这个问题时的解决思路,遇到的时候按照步骤排查一下。

步骤

1. 根据报错提示,首先确定找不到的方法是属于哪个库或者源代码的,可以问问百度或者AI这个方法是属于谁的:

  • 检查下会不会存在拼写错误之类的。
  • 如果是系统库,可以进一步检查系统库目录下是否存在这个库,部分裁剪的系统(如一些开发板)可能缺少一些系统库,这个时候通常就需要下载这个库的源码然后编译生成对应的库或者避免使用该系统库了。
  • 如果是第三方的库,加一下日志看看是否真的有链接目标库,比如 cmake 的 target_link_libraries 语句没有指定上需要链接的库。

2. 确认链接的库中是否真的包含找不到的方法

如果你认为找不到的方法是属于某个库的,可以通过下面命令查看库中是否包含指定的方法:

nm -C xxx.a | grep function

注意: xxx.a 是目标库,function替换为方法名。

如果目标库中并不包含指定的方法,就该查查是否使用了错误的库或者错误版本的库。

3. 链接顺序

这个问题笔者在使用 opencv 静态库的时候遇到过,即 cv::resize() 等方法明明存在且库也链接了,但依旧出现很多找不到引用的报错,后面发现链接多个静态库的时候是存在先后顺序的(从后往前)。

可以通过添加编译选项来解决链接顺序问题,如:

target_link_libraries(${PROJECT_NAME}-Wl,--start-group${OPENCV340_LIBS}-Wl,--end-group
)

使用成对的 -Wl,--start-group -Wl,--end-group 将存在链接顺序的一系列静态库包含在其中即可。

4. 动态库方法是否公开

比如内部自己开发的一些公共动态库,但由于忘记将公开的方法指定为公开,而导致使用者无法访问。

可以定义一个公开的宏定义,示例代码:

#ifdef _MSC_VER#define EXPORT_API_ __declspec(dllexport)  // Windows
#else#define EXPORT_API_ __attribute__((visibility ("default")))  // Linux
#endif

5. 善用 AI

如果以上依旧没解决,现在AI也挺智能的了,可以把问题贴给AI去看看。

http://www.xdnf.cn/news/5672.html

相关文章:

  • vue+element下拉选择器默认选择第一个并根据选择项展示相关数据
  • 瑞派宠物医生:借腔镜影像妙技,筑牢宠物生命防线
  • 4.MySQL全量、增量备份与恢复
  • 构造二叉树
  • STM32的TIMx中Prescaler和ClockDivision的区别
  • AI与IoT携手,精准农业未来已来
  • Nacos源码—8.Nacos升级gRPC分析六
  • 2025年5月12日第一轮
  • 最大子数组和
  • Ubuntu虚拟机文件系统扩容
  • 通过Windows操作系统双因素认证实现工业设备安全运维:安当SLA
  • 论文学习_A Survey of Binary Code Similarity
  • 生成式人工智能认证(GAI认证)适合人群
  • 电商平台一站式网络安全架构设计指南
  • 自动化测试与功能测试详解
  • 【办公类-99-06】20250512用Python制作PPT的GIF照片动图(统一图片大小、自定义不同切换秒数,以蝴蝶为例)
  • 并发笔记-信号量(四)
  • ActiveMQ 高级特性:延迟消息与优先级队列实战(二)
  • MultiTTS 1.7.6 | 最强离线语音引擎,提供多音色无障碍朗读功能,附带语音包
  • 使用PhpStudy搭建Web测试服务器
  • 机动车授权签字人备考考试题库及答案
  • HLS图像处理:从算法到硬件的创新加速之旅
  • 蓝牙AVDTP协议概述
  • 配置Hadoop集群环境准备
  • Python集成开发环境之Thonny
  • Python实例题:Django搭建简易博客
  • FEKO许可证的安全与合规性
  • uni-app微信小程序登录流程详解
  • linux-驱动开发之设备树详解(RK平台为例)
  • 【递归、搜索与回溯】专题一:递归(一)