c++程序链接阶段:undefined reference to xxx function(未定义引用问题)原因解析

本文分析了C++程序在链接阶段遇到'undefined reference to xxx function'错误的原因,主要分为三方库未包含所需符号和名称混淆两方面。解决办法包括使用`extern "C"`来避免C++的名称修饰,确保链接器能找到正确的符号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题分析

c++程序,在链接阶段,当你的程序引用了第三方库中定义的函数时(程序内部定义的函数不涉及这个问题,因为函数的实现已经在自己的代码段、数据段中了),连接器会在三方库中搜索当前符号表中未定义的符号(这些未定义的符号需要在三方库中定位到,否则就会出现对xxx函数未定义引用),当在三方库的符号表中找不到对应的符号时,就会报undefined reference to xxx function。

注意,当遇到这个问题时,首先要排除是否三方库有没有被正确链接。当三方库没有被正确链接时,报的错误通常是“can not find -lxxxlib”,即找不到xxx库,而不是未定义引用,所以,遇到未定义问题时,说明库已经链接上了,但是没找到符号。

有两个导致未定义引用的原因:

  1. 三方库确实没有该符号,或者没有该符号的定义。通过readelf -s xxx.lib可以查看三方库中该符号的状态,如果该符号缺失,或者该符号是未定义的,那么说明三方库本身有问题。
  2. 三方库中确实定义了该符号,但是你的连接器没找到。为什么会没找到呢?最可能的原因,是你混合c/c++编程时,会遇到的:即三方库是c库,提供的符号都是按c编译器生成的,没有经过命名混淆的(name mangling),比如对于三方库中某个函数int add(double, double),按c编译器编译出来后形成的符号是类似_add这种,但是按照c++编译器生成的符号是诸如_adddd这种,那么,当你的c+&#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值