gcc "undefined reference to" 问题解决方法(使用库)

代码编译报错`undefined reference to`:链接库缺失的3种解决方案 在C/C++开发中,undefined reference to错误通常由库文件缺失、路径配置错误或链接顺序不当引发。本文总结了三种核心解决方案:1. 检查并正确链接缺失的库文件,通过find命令确认库文件存在,并在编译命令中添加-l和-L选项;2. 处理库依赖顺序问题,确保依赖库在被依赖库之后链接,或使用--start-group和--end-group选项;3. 处理C/C++混合编译的符号修饰问题,通过extern "C"声明抑制C++的函数名修饰。通过这三种方法,开发者可以有效解 阅读详情

最近在Linux下编程发现一个诡异的现象,就是在链接一个静态库的时候总是报错,类似下面这样的错误:


  1. (.text+0x13): undefined reference to `func' 

    关于undefined reference这样的问题,大家其实经常会遇到,在此,我以详细地示例给出常见错误的各种原因以及解决方法,希望对初学者有所帮助。

1.  链接时缺失了相关目标文件(.o)

    测试代码如下:

 

    然后编译。


  1. gcc -c test.c  
  2. gcc –c main.c 

    得到两个 .o 文件,一个是 main.o,一个是 test.o ,然后我们链接 .o 得到可执行程序:


  1. gcc -o main main.o 

    这时,你会发现,报错了:


  1. main.o: In function `main':  
  2. main.c:(.text+0x7): undefined reference to `test'  
  3. collect2: ld returned 1 exit status 

    这就是最典型的undefined reference错误,因为在链接时发现找不到某个函数的实现文件,本例中test.o文件中包含了test()函数的实现,所以如果按下面这种方式链接就没事了。


  1. gcc -o main main.o test.o 

   【扩展】:其实上面为了让大家更加清楚底层原因,我把编译链接分开了,下面这样编译也会报undefined reference错,其实底层原因与上面是一样的。


  1. gcc -o main main.c //缺少test()的实现文件 

需要改成如下形式才能成功,将test()函数的实现文件一起编译。


  1. gcc -o main main.c test.c //ok,没问题了 

2.    链接时缺少相关的库文件(.a/.so)

    在此,只举个静态库的例子,假设源码如下。

    先把test.c编译成静态库(.a)文件


  1. gcc -c test.c  
  2. ar -rc test.a test.o 

    至此,我们得到了test.a文件。我们开始编译main.c


  1. gcc -c main.c 

    这时,则生成了main.o文件,然后我们再通过如下命令进行链接希望得到可执行程序。


  1. gcc -o main main.o 

    你会发现,编译器报错了:


  1. /tmp/ccCPA13l.o: In function `main':  
  2. main.c:(.text+0x7): undefined reference to `test'  
  3. collect2: ld returned 1 exit status 

    其根本原因也是找不到test()函数的实现文件,由于该test()函数的实现在test.a这个静态库中的,故在链接的时候需要在其后加入test.a这个库,链接命令修改为如下形式即可。


  1. gcc -o main main.o ./test.a  //注:./ 是给出了test.a的路径 

     【扩展】:同样,为了把问题说清楚,上面我们把代码的编译链接分开了,如果希望一次性生成可执行程序,则可以对main.c和test.a执行如下命令。


  1. gcc -o main main.c ./test.a  //同样,如果不加test.a也会报错 

3.    链接的库文件中又使用了另一个库文件

    这种问题比较隐蔽,也是我最近遇到的与网上大家讨论的不同的问题,举例说明如下,首先,还是看看测试代码。

    从上图可以看出,main.c调用了test.c的函数,test.c中又调用了fun.c的函数。
    首先,我们先对fun.c,test.c,main.c进行编译,生成 .o文件。


  1. gcc -c func.c  
  2. gcc -c test.c  
  3. gcc -c main.c 

    然后,将test.c和func.c各自打包成为静态库文件。


  1. ar –rc func.a func.o  
  2. ar –rc test.a test.o 

    这时,我们准备将main.o链接为可执行程序,由于我们的main.c中包含了对test()的调用,因此,应该在链接时将test.a作为我们的库文件,链接命令如下。


  1. gcc -o main main.o test.a 

    这时,编译器仍然会报错,如下:


  1. test.a(test.o): In function `test':  
  2. test.c:(.text+0x13): undefined reference to `func'  
  3. collect2: ld returned 1 exit status 

    就是说,链接的时候,发现我们的test.a调用了func()函数,找不到对应的实现。由此我们发现,原来我们还需要将test.a所引用到的库文件也加进来才能成功链接,因此命令如下。


  1. gcc -o main main.o test.a func.a 

    ok,这样就可以成功得到最终的程序了。同样,如果我们的库或者程序中引用了第三方库(如pthread.a)则同样在链接的时候需要给出第三方库的路径和库文件,否则就会得到undefined reference的错误。

4 多个库文件链接顺序问题

    这种问题也非常的隐蔽,不仔细研究你可能会感到非常地莫名其妙。我们依然回到第3小节所讨论的问题中,在最后,如果我们把链接的库的顺序换一下,看看会发生什么结果?


  1. gcc -o main main.o func.a test.a 

    我们会得到如下报错.


  1. test.a(test.o): In function `test':  
  2. test.c:(.text+0x13): undefined reference to `func'  
  3. collect2: ld returned 1 exit status 

    因此,我们需要注意,在链接命令中给出所依赖的库时,需要注意库之间的依赖顺序,依赖其他库的库一定要放到被依赖库的前面,这样才能真正避免undefined reference的错误,完成编译链接。

5. 在c++代码中链接c语言的库

    如果你的库文件由c代码生成的,则在c++代码中链接库中的函数时,也会碰到undefined reference的问题。下面举例说明。

    首先,编写c语言版库文件: 

    

    编译,打包为静态库:test.a


  1. gcc -c test.c  
  2. ar -rc test.a test.o 

    至此,我们得到了test.a文件。下面我们开始编写c++文件main.cpp

    

    然后编译main.cpp生成可执行程序:


  1. g++ -o main main.cpp test.a 

    会发现报错:


  1. /tmp/ccJjiCoS.o: In function `main': 
  2. main.cpp:(.text+0x7): undefined reference to `test()' 
  3. collect2: ld returned 1 exit status 

    原因就是main.cpp为c++代码,调用了c语言库的函数,因此链接的时候找不到,解决方法:即在main.cpp中,把与c语言库test.a相关的头文件包含添加一个extern "C"的声明即可。例如,修改后的main.cpp如下:

    


  1. g++ -o main main.cpp test.a 

    再编译会发现,问题已经成功解决。

undefined reference to symbol xxxxx和undefined symbol:xxxx错误的原因分析以及解决方法 Linux下编译程序时,经常会遇到“undefined reference to XXX” 报错, 这里总结一些可能的原因和解决方案,给需要的朋友: 说到undefined reference error,先提一下Linux gcc链接规则: 编译源代码时,链接的时候查找顺序是: (1) -L 指定的路径, 从左到右依次查找 (2) 由环境变量 LIBRARY_PATH 指定的路径, 阅读详情

相关推荐

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

GCC在编译-链接过程中,很常见的一种链接错误就是 **undefined reference to 'xxx'**,可能你对这种错误的解决方式已经了然于胸了,但本文要介绍的一种情况,可能你未曾注意到,如果按照往常的解决思路并不一定能帮助你解决问题。带着这个问题,本文将给大家剖开一个新的知识点,希望对大家今后排查此类问题有所帮助。.........

一个专注于嵌入式IoT领域的架构师,深耕IoT领域多年,深度掌握IoT领域的相关技术栈,包括但不限于RTOS内核的实现及其移植、硬件驱动移植开发、网络通讯协议开发、编译构建原理及其实现、底层汇编及编译原理、编译优化及代码重构、嵌入式IoT系统的架构设计等。 1万+

undefined reference问题总结

<br />最近在Linux下编程发现一个诡异的现象,就是在链接一个静态库的时候总是报错,类似下面这样的错误: (.text+0x13): undefined reference to `func' <br />    关于undefined reference这样的问题,网上也有很多的说法,在此,我以详细地示例给出其中的各种原因说明以及解决方法,然后再给出我所遇到的与大家均不同的问题。<br />1.  链接时缺失了相关目标文件(.o)<br />    测试代码如下:<br />  <br />  

Listening_music的专栏 1万+

Ubuntu下GCC编程常见问题及解决方法

这可能是由于函数的定义未被包含在编译过程中引起的。当使用GCC编译程序时,如果出现类似于"undefined reference to ‘main’"的错误,这通常意味着编译器无法找到程序的入口点。在使用GCC编译链接时,如果出现类似于"cannot find -llibrary_name"的错误,表示编译器无法找到所需的库文件。希望通过本文的介绍,能够帮助您更好地理解和解决在编程过程中可能遇到的问题。如果编译器报告无法找到特定的头文件,这可能是因为头文件未正确安装或未在编译命令中指定正确的包含路径。

TechInk的博客 472

【我的C/C++语言学习进阶之旅】C++编程常出现错误:Undefined Reference的一些常见情况分析

这是导致“Undefined reference”错误的最简单原因。程序员只是忘记了定义对象。考虑以下 C++ 程序。这里我们只是指定了函数的原型,然后在主函数中使用它。# include // 声明函数 int func1();// 调用函数 func1();}编译出错,如下所示:因此,当我们编译这个程序时,会发出“undefined reference to `func1()'”的链接器错误。为了消除这个错误,我们通过提供函数 func1 的定义来更正程序如下。

字节卷动 2万+

编译,连接 -- 笔记

1linux 程序与库的符号,Linux动态库(.so)符号表 linux 程序与库的符号,Linux动态库(.so)符号表_weixin_39528029的博客-优快云博客 1.1.动态链接库的符号表 动态链接库(shared object library)在linux里以.so结尾,是elf(Executable and Linkable Format)文件的一种,有两个符号表:“.symtab”和“.dynsym”。 .symtab: 包含大量的信息(包括全局符号global symbo.

tianyu的专栏 - Linux site:blog.youkuaiyun.com/wishfly 1195

Python爬虫实战:手把手教你用Selenium绕过药监局网站的反爬机制(附完整代码)

本文详细介绍了如何使用Selenium绕过药监局网站的反爬机制,提供了一套完整的Python爬虫实战方案。通过浏览器指纹伪装、动态等待策略、会话维持技巧以及分布式采集设计,帮助开发者高效爬取药监局数据,解决政府类网站常见的反爬挑战。

weixin_42620255的博客 737

STM32 GCC 使用 USB 库出现”undefined reference to _sbrk”问题解决

STM32 GCC 使用 USB 库出现”undefined reference to _sbrk”问题的主要原因在于 USB 库中使用了 malloc() 和 free() 函数。

Lion Chen i 咖啡 9553

Android WIFI体系:深入解析WifiLock与MulticastLock的底层实现与性能优化

本文深入解析Android WIFI体系中WifiLock与MulticastLock的底层实现机制与性能优化策略。WifiLock通过阻止Wi-Fi休眠提升网络性能,尤其WIFI_MODE_FULL_HIGH_PERF模式可显著降低延迟;MulticastLock则控制组播数据接收,但会增加功耗。文章详细探讨了其与wpa_supplicant、HAL层的交互,并提供高性能场景下的优化实践与功耗平衡方案。

php55的博客 1079

Linux下undefined reference to ‘pthread_create’问题解决

问题:出现“undefined reference to ‘pthread_create’”,所有关于线程的函数都会有此错误,导致无法编译通过。 问题的原因:pthread不是Linux下的默认的库,也就是在链接的时候,无法找到phread库中哥函数的入口地址,于是链接会失败。 解决:在gcc编译的时候,附加要加 -lpthread参数即可解决。  eg:gcc rwlock.c -g -l...

Lawrence_121 1万+

从AAAI 2025被拒到ACM MM 2025录用:我的论文投稿经验与教训总结

本文分享了作者从AAAI 2025被拒到ACM MM 2025录用的论文投稿经验与教训。详细解析了格式要求、可复现性清单等关键细节,提供了精准转投策略和提升录用概率的实用技巧,帮助研究者避免常见错误并优化投稿策略。

weixin_29207533的博客 502

Spring AI Alibaba 1.x 源码分析-架构设计

本文通过分析Spring AI Alibaba 框架的源码,分析出其原理和架构设计,无论是用于项目开发、技术评估还是团队培训都具有重要价值。

program哲学 487

Linux下undefine reference to 'FT_Init_FreeType'的解决办法

导入FreeType库后进行编译连接,会出现“undefined reference to 'FT_Init_FreeType'”等错误,所有关于FreeType库的函数都会有此错误,导致无法编译通过。 问题的原因:FreeType不是Linux下的默认的库,也就是在链接的时候,无法找到FreeType库中函数的入口地址,于是链接会失败。 解决:在gcc编译的时候,附加要加 -lfreet

kalp_yp 6055

Spark中Application、Job、Stage和Task区别详解

在Spark中,有一些关键的概念,如Application、Job、Stage和Task,它们描述了Spark作业的不同层次和组成部分。下面我将详细介绍每个概念,并通过示例说明它们之间的区别。

优快云 精品推荐 901

主程序链接linux下编译出的动态库so提示 undefined reference to“”

今天打算把lua源码编译到库中,主程序访问时提示undefined reference to “lua_type” ??? 然后 nm -D libNAME.so >> a.txt查看有此接口啊? 经过百度才知道要 C++/C混编出问题了,毕竟makefile中用的g++ 把g++修改为gcc -lstdc++ 后在编译主程序的时候就ok啦~ ...

pes2020的博客 2086

SIMATIC WINCC V8.0安装教程(Win11系统)

SIMATIC WINCC V8.0安装教程(Win11系统)

Robot_PLC_HMI_Automation 9032

DeepSeek掘金——用DeepSeek模型构建AI 代理

在本综合指南中,我们将探讨如何利用 DeepSeek 的功能构建能够以有意义的方式理解、推理和交互的复杂 AI 代理。人工智能领域正在迅速发展,DeepSeek 的模型代表了智能 AI 代理开发的重大进步。在本综合指南中,我们将探讨如何利用 DeepSeek 的功能构建能够以有意义的方式理解、推理和交互的复杂 AI 代理。

3857

Linux下编译nmealib-0.5.3出现错误的解决办法

 错误提示:gcc  samples/generate/main.o -lm -Llib -lnmea -o build/samples_generatelib/libnmea.a(generate.o): In function `nmea_gsv_npack':generate.c:(.text+0x700): undefined reference to `ceil'collect2: ld...

lopathy的博客 659

【CanMV K210】AI 视觉 MNIST 手写数字识别与分类推理

本文介绍了基于CanMV K210开发板的MNIST手写数字识别实验。实验通过摄像头采集图像,经过开窗、灰度化、缩放、反色等预处理后,使用KPU神经网络加速器运行MNIST分类模型,最终在LCD上显示识别结果。重点讲解了分类模型与检测模型的区别、图像预处理流程以及KPU推理结果的解析方法。实验帮助理解从图像采集到分类输出的完整AI视觉处理链路,并提供了调试思路和硬件连接说明。

Mr数据杨 364

C++编译通识:编译、链接从理论到实践

本文从基础工具到实践问题,再到底层原理,梳理了 C++ 编译链接的核心知识点,希望能帮助新手打通「理论 - 实践」的鸿沟,少踩坑、多落地。

natural_Caduceus 598

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

"undefined reference to" 问题解决方法

最近在Linux下编程发现一个诡异的现象,就是在链接一个静态库的时候总是报错,类似下面这样的错误: (.text+0x13): undefined reference to `func'      关于undefined reference这样的问题,大家其实经常会遇到,在此,我以详细地示例给出常见错误的各种原因以及解决方法,希望对初学者有所帮助。 1.  链接时缺失了相关目标文件(.o)

aiwoziji13的专栏 86万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

“undefined reference to XXX“问题分析及解决方法总结

所有linux下 C编译 "undefined reference to XXX"问题总结

迈微AI研习社 · 号主 8万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

undefined reference to错误的解决方法

陈运文 Linux下编译程序时,经常会遇到“undefined reference to XXX” 报错,这里总结一些可能的原因和解决方案,给需要的朋友: 说道undefined reference error,先提一下Linux gcc链接规则: 链接的时候查找顺序是: -L 指定的路径, 从左到右依次查找 由 环境变量 LIBRARY_PATH 指定

优快云 30万+

【C++】undefined reference to找不到符号问题汇总及解决方法

https://segmentfault.com/a/1190000006049907?utm_source=tuicool&utm_medium=referral https://blog.youkuaiyun.com/aiwoziji13/article/details/7330333 https://blog.youkuaiyun.com/qq_17835733/article/details/72521019

我的笔记本 3万+

gcc “undefined reference to“ 问题解决方法

文章目录1.linux下查找库文件所在位置2.如何查看库里面包含的函数3.烦人的undefined reference to4.gcc "undefined reference to" 问题解决方法 1.linux下查找库文件所在位置 ldconfig -p | grep libcrypto 2.如何查看库里面包含的函数 使用linux系统的nm命令。很简单。在我用的时候遇到了一个问题: ...

喜欢打篮球的普通人 5468

编译错误“ undefined reference to ‘sqrt‘ ”解决方法小结

0x00 前言 文章中的文字可能存在语法错误以及标点错误,请谅解; 如果在文章中发现代码错误或其它问题请告知,感谢! 该演示运行的Linux发行版本 (#cat /etc/issue):Ubuntu 14.04.1 LTS \n \l 该演示运行的Linux内核信息 (#cat /proc/version):Linux version 3.13.0-32-generic (buildd@kissel) (gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) ) #57-Ubu

C/C++攻城狮 2万+
上一篇: Zephyr OS 内核篇: 内核链表
下一篇: 一个Lex/Yacc完整的示例(可使用C++)
csshuke
博客等级 码龄16年 1517粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值