[C / C++] undefined reference问题总结: 我在Google上目前找到最为全面并容易理解的

Qt C++项目集成MeloTTS.cpp:纯C++离线TTS引擎的完整实践指南 文本转语音(TTS)技术是实现人机交互和信息无障碍访问的核心功能之一,其原理是将文本数据通过声学模型和声码器转换为自然流畅的语音波形。在桌面应用开发中,TTS能够显著提升用户体验,尤其适用于教育软件、辅助工具和工业监控等需要语音播报的场景。传统的TTS方案往往面临跨平台兼容性差、依赖网络或运行时环境复杂等挑战。本文聚焦于纯C++实现的轻量级TTS引擎MeloTTS.cpp,深入探讨其在Qt C++项目中的集成方案。通过CMake构建系统管理依赖,结合Pimpl模式封装核心API,并设计异步任务队列管理语音合 阅读详情

来自: http://ticktick.blog.51cto.com/823160/431329


标签:Linux 方法 解决 总结 undefined reference
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://ticktick.blog.51cto.com/823160/431329

最近在Linux下编程发现一个诡异的现象,就是在链接一个静态库的时候总是报错,类似下面这样的错误:
(.text+0x13): undefined reference to `func'

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

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

测试代码如下:



然后编译。
gcc -c test.c
gcc –c main.c

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


这时,你会发现,报错了:
main.o: In function `main':
main.c:(.text+0x7): undefined reference to `test'
collect2: ld returned 1 exit status

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

【扩展】:其实上面为了让大家更加清楚底层原因,我把编译链接分开了,下面这样编译也会报undefined reference错,其实底层原因与上面是一样的。
gcc -o main main.c //缺少test()的实现文件

需要改成如下形式才能成功,将test()函数的实现文件一起编译。
gcc -o main main.c test.c //ok,没问题了

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

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



先把test.c编译成静态库(.a)文件
gcc -c test.c
ar -rc test.a test.o

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

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

你会发现,编译器报错了:
/tmp/ccCPA13l.o: In function `main':
main.c:(.text+0x7): undefined reference to `test'
collect2: ld returned 1 exit status

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

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

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

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

这时,编译器仍然会报错,如下:
test.a(test.o): In function `test':
test.c:(.text+0x13): undefined reference to `func'
collect2: ld returned 1 exit status

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

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

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

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

我们会得到如下报错.
test.a(test.o): In function `test':
test.c:(.text+0x13): undefined reference to `func'
collect2: ld returned 1 exit status

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

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

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

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



编译,打包为静态库:test.a
gcc -c test.c
ar -rc test.a test.o

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



然后编译main.cpp生成可执行程序:
g++ -o main main.cpp test.a

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

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


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

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

6. 总 结

当然,上面几种是我目前发现的比较常见的undefined reference错误的原因和解决方法,可能也有其他各种原因,欢迎大家来信lujun.hust@gmail.com交流,对本文档进行补充,方面新手们解决学习过程中遇到的各种问题。


本文出自 “对影成三人” 博客,请务必保留此出处http://ticktick.blog.51cto.com/823160/431329



Google CEL-CPP:安全高效的C++表达式语言,构建动态规则引擎 表达式语言是一种用于动态计算和逻辑判断的领域特定语言,它允许程序在运行时解析和执行外部输入的代码片段,而无需修改和重新编译主程序。其核心原理在于将字符串形式的表达式解析为抽象语法树,并在一个受控的沙箱环境中进行类型检查和求值,从而在灵活性和安全性之间取得平衡。这种技术的核心价值在于实现了业务逻辑的动态化与配置化,极大地提升了系统的可扩展性和运维效率。在工程实践中,它被广泛应用于需要动态策略的场景,例如风控系统的实时规则判断、微服务网关的请求路由决策、低代码平台的自定义计算逻辑以及游戏服务器的行为验证等。Go 阅读详情

相关推荐

Code::Blocks新手必看:C/C++编译报错与警告全解析及实战解决指南

在C/C++编程学习中,编译报错与警告是每位开发者必经的调试环节。编译器作为代码的‘语法检查器’,其报错信息本质上是代码不符合语言规范或存在潜在风险的提示。理解报错原理,是提升独立调试能力、编写健壮程序的基础技术能力。从语法错误、语义错误到链接错误,不同类型的报错对应着代码结构、项目配置或构建流程中的特定问题。例如,常见的‘undefined reference’属于链接阶段错误,而‘expected ‘;’ before’则是典型的语法错误。处理这些错误不仅能解决当前程序无法运行的问题,更能深化对程序编译

weixin_33725270的博客 429

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

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

字节卷动 2万+

VSCode配置C/C++开发环境:从零搭建智能感知、编译与调试工作流

集成开发环境(IDE)通过整合代码编辑、编译构建和调试功能,极大提升了开发效率。其核心原理在于将编译器、调试器等工具链与编辑器深度集成,并提供智能感知(IntelliSense)等辅助功能。对于C/C++这类系统级语言,一个配置得当的开发环境不仅能加速编码,更能帮助开发者深入理解项目构建过程。Visual Studio Code(VSCode)凭借其轻量、跨平台和强大的扩展生态,成为搭建定制化C/C++ IDE的理想平台。通过配置c_cpp_properties.json、tasks.json和launch

weixin_33725515的博客 299

"undefined reference to" 问题汇总及解决方法

在实际编译代码的过程中,我们经常会遇到"undefined reference to"的问题,简单的可以轻易地解决,但有些却隐藏得很深,需要花费大量的时间去排查。工作中遇到了各色各样类似的问题,按照以下几种可能出现的状况去排查,可有利于理清头绪,从而迅速解决问题。 链接时缺失了相关目标文件 首先编写如下的测试代码: // test.h ...

weixin_34381666的博客 3万+

C++单元测试实战指南:从Google Test到工程化实践

单元测试是软件工程中验证代码最小可测试单元(如函数或类)正确性的核心实践,其原理在于通过预设输入与断言,在隔离环境中自动化验证输出是否符合预期。这一技术对于提升代码质量、保障软件稳定性具有重要价值,尤其适用于C++这类涉及复杂内存管理和跨平台特性的系统级开发场景。通过引入单元测试,开发者能构建重构的“安全网”,驱动模块化设计,并形成活化的开发文档。在C++生态中,Google Test等成熟框架配合CMake构建工具,为搭建高效测试环境提供了坚实基础。本文聚焦于C++单元测试的实战落地,详细解析了如何利用G

weixin_33968104的博客 418

commander-cpp:单头文件C++ CLI库的工业级实践

CLI(命令行接口)是C++系统工具开发的基础能力,其核心在于参数解析、帮助文档生成与类型安全校验。传统方案如getopt或boost::program_options常面临编译依赖重、文档与代码不同步、子命令管理复杂等工程痛点。commander-cpp以C++17现代特性为基石,通过单头文件实现零构建耦合,利用链式调用建模CLI语义层级,并在编译期完成帮助文本生成与类型反射,显著提升工业场景下的可维护性与确定性。它不仅简化了车载诊断、OTA升级等嵌入式CLI开发,更可作为跨协议(HTTP/gRPC/MQ

angzhan5306的博客 383

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

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

我的笔记本 3万+

Code::Blocks-20.03深度解析:轻量级C/C++ IDE的设计哲学与实战指南

集成开发环境(IDE)是程序员提升开发效率的核心工具,它通过整合代码编辑、编译、调试等功能,简化了软件开发流程。其工作原理在于为特定的编程语言和工具链提供统一的操作界面和项目管理。对于C/C++开发而言,一个优秀的IDE能显著降低环境配置复杂度,让开发者更专注于算法和逻辑实现。Code::Blocks作为一款经典的开源跨平台IDE,其价值在于贯彻了“以编译器为中心”和“插件化架构”的设计理念,在保持核心轻量化的同时,提供了高度的可定制性和环境可控性。这使得它在教学、快速原型开发以及对编译环境有纯净要求的场景

weixin_34074740的博客 436

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

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

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

C/C++程序员技术发展路径全解析:从底层到AI的进阶指南

在计算机编程领域,C/C++作为系统级和高性能计算的核心语言,其技术生态始终围绕性能优化、内存管理和底层控制展开。理解其编译链接原理、对象内存模型和多线程并发机制,是构建大型稳定系统的基石。这些技术能力在操作系统开发、游戏引擎、金融交易系统等对实时性和可靠性要求极高的场景中具有不可替代的价值。随着技术发展,现代C++工程化实践和工具链演进,如CMake构建系统和Clang/LLVM生态,正不断提升开发效率。同时,C/C++与AI推理、异构计算(如CUDA)的结合,为其在高性能计算和中间件领域开辟了新的应用前

weixin_34174322的博客 346

中国大学MOOC-翁恺-C语言程序设计习题集-解答汇总

中国大学MOOC-翁恺-C语言程序设计习题集 PAT 习题集 02-0. 整数四则运算(10) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 乔林(清华大学) 本题要求编写程序,计算2个正整数的和、差、积、商并输出。题目保证输入和输出全部在整型范围内。 输入格式: 输入在一行中给出2...

weixin_30691871的博客 3万+

undefined reference问题总结

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

weixin_34194317的博客 910

Calibre电子书阅读器个性化样式定制指南

本文详细介绍了如何通过Calibre电子书阅读器的用户样式表功能进行深度个性化样式定制。从修改全局字体、行距、背景配色(包括深色/浅色模式)到美化代码块、引用等特殊元素,本指南提供了完整的CSS代码示例与实战技巧,帮助用户打造专属的舒适阅读环境,显著提升电子书阅读体验。

vv45678的博客 920

Google Benchmark编译与运行时问题终极解决方案

C++性能优化是提升软件效率的关键技术,其核心在于准确测量代码执行时间与资源消耗。Google Benchmark作为业界广泛使用的微基准测试框架,通过精细控制测试流程与统计方法,为开发者提供可靠的性能数据。然而,在实际工程实践中,编译与运行时问题常成为阻碍。从CMake配置、依赖管理到ABI兼容性,每一个环节都可能引发构建失败或运行时崩溃,特别是在交叉编译、多线程环境及容器化部署等复杂场景下。本文针对这些高频痛点,系统梳理了从源码编译、项目集成到稳定运行的完整解决方案,涵盖Yocto项目中的编译线程数优化

weixin_33672400的博客 288

Visual Studio Installer下载失败的5种修复方法(含DNS修改/补丁安装)

本文针对Visual Studio Installer下载安装文件失败的问题,提供了从网络层到系统层的深度排查与修复指南。详细介绍了DNS修改、代理配置、防火墙设置、系统服务检查等5种核心修复方法,并包含离线安装与手动补丁等替代方案,帮助开发者彻底解决安装难题。

sprite的博客 1618

C++测试框架实战指南:Google Test与Catch2核心对比与应用

单元测试是软件工程中保障代码质量的核心实践,通过隔离最小可测试单元并自动化验证其行为,能够有效提升代码的健壮性与可维护性。其原理在于构建快速反馈机制,通过断言验证预期输出,并利用测试替身(如Mock对象)模拟外部依赖。这一技术价值在于支持持续集成与安全重构,是工程化开发范式的关键。在C++生态中,Google Test以其强大的Mock库(Google Mock)和成熟的参数化测试功能著称,尤其适合大型项目与复杂场景;而Catch2则凭借其极简的Header-only部署和独特的BDD风格语法,为追求开发效

weixin_34296641的博客 388

LabVIEW vs Python:谁更适合你的ATE自动化测试系统?实测对比与选型建议

本文深入对比了LabVIEW和Python在ATE自动化测试系统中的性能表现、开发效率和应用场景,帮助工程师根据实时控制需求、数据处理复杂度及团队技能做出最优选型决策。通过实测数据和典型案例,分析两者在硬件集成、系统性能和维护成本等方面的差异,并提供混合架构实施建议。

weixin_29240711的博客 277

C/C++学习路径全解析:从核心基础到工程实践的系统指南

C和C++作为系统编程和高性能计算的基石,其核心在于对计算机底层原理的深刻理解,尤其是内存管理和指针机制。理解指针的本质是内存地址的抽象,以及动态内存分配与释放的原理,是掌握这两门语言的关键。这种底层控制能力带来了无与伦比的性能优势和技术价值,使其在操作系统、游戏引擎、嵌入式系统等对效率和资源控制有严苛要求的领域不可替代。在实际开发中,合理运用智能指针等现代C++特性,结合标准模板库(STL)提供的泛型容器和算法,能大幅提升代码的健壮性和开发效率。本文基于资深开发者的经验,系统梳理了从C语言核心到现代C++

weixin_34208185的博客 455

攻击时间控制的动态逆三维制导律(源代码)

%参考文献:《攻击时间控制的动态逆三维制导律》,哈尔滨工程大学学报,2010 %编程难点:视线坐标系与参考坐标系间的转换关系 一、采用本文方法结果 二、偏航通道采用增广比例导引律

算法小站 2393

Unreal5从入门到精通之Landscape地形系统

虚幻引擎 5 (UE5) 能够利用其强大的地形编辑工具套件创建大规模的地形世界。使用地形工具可以创建身临其境的户外地形,这些地形经过优化,可在多种不同设备上保持可播放的帧速率。

TxNet 4143

C/C++实现欧几里得距离:从数学原理到性能优化实战

距离度量是计算机科学中衡量数据点间相似性或差异性的基础概念,其核心原理源于几何空间中的直线距离计算。在机器学习、图形学和游戏开发等应用场景中,欧几里得距离因其直观的几何意义成为最常用的度量方式之一,尤其在KNN算法、聚类分析和空间碰撞检测中发挥着关键作用。本文聚焦于C/C++语言环境,深入探讨欧几里得距离的高效实现与性能优化技巧,涵盖从基础的二维、三维计算到通用的N维向量处理,并针对浮点数精度、大数计算等常见工程挑战提供稳定解决方案。通过对比曼哈顿距离等其他度量方式,帮助开发者根据数据特性进行合理选型,并结

weixin_30617797的博客 491

Nginx C++模块开发实战:从C语言扩展到现代C++业务集成

在Web服务器和高性能中间件开发领域,模块化架构是提升系统灵活性和可扩展性的核心设计模式。Nginx作为业界领先的高并发Web服务器,其纯C语言编写的核心模块提供了卓越的性能和稳定性,但面对复杂的业务逻辑集成时,C语言的开发效率与资源管理能力面临挑战。通过引入C++语言扩展Nginx模块,开发者可以在保持Nginx高效事件驱动框架的同时,利用C++的面向对象特性、RAII(资源获取即初始化)机制以及丰富的STL标准库,显著提升复杂业务逻辑的开发效率和代码可维护性。这种混合编程模式的核心技术价值在于,它允许将

weixin_30338497的博客 411

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C/C++项目目录结构设计:从根源代码到企业级规范实践

在C/C++开发中,项目目录结构是代码组织的基石,直接影响项目的可维护性、可扩展性和团队协作效率。其核心原理在于通过清晰的物理分层和模块化设计,实现源码、配置、构建产物与第三方依赖的分离,从而降低耦合度、提升构建速度。这一实践的技术价值在于为现代构建工具链(如CMake)提供友好支持,便于自动化测试、文档生成和持续集成。典型的应用场景包括个人项目规范化、团队协作开发以及历史遗留代码重构。本文以CMake构建系统和模块化设计为核心,深入解析如何设计一个清晰、健壮的企业级C/C++项目根源代码目录结构,帮助开发

weixin_34245749的博客 377

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C++项目实战:从环境配置到快递费计算器开发全流程

C++作为一门经典的编译型语言,其核心在于将高级代码转换为机器可执行的指令。理解这一过程需要掌握编译器、链接器等工具链的工作原理,这是构建任何C++项目的技术基础。在工程实践中,一个高效、可维护的开发环境至关重要,这涉及到代码编辑、智能提示、构建自动化与调试工具的整合。VSCode作为现代轻量级编辑器,通过C/C++扩展和tasks.json、launch.json等配置文件,能够搭建出强大的C++工作流,实现一键编译与图形化调试。这种环境配置能力是开发者从理论学习迈向项目实战的关键一步。本文以“快递费计算

weixin_30588675的博客 485

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

上一篇: [Deferred] UML Book List
下一篇: [Ubuntu + VNC] 配置VNC服务, 配置VNC服务在开机时启动
Dooit
博客等级 码龄18年 11粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值