“undefined reference to“ 问题汇总及解决方法 ------非常非常好的一篇文章

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

在实际编译代码的过程中,我们经常会遇到"undefined reference to"的问题,简单的可以轻易地解决,但有些却隐藏得很深,需要花费大量的时间去排查。工作中遇到了各色各样类似的问题,按照以下几种可能出现的状况去排查,可有利于理清头绪,从而迅速解决问题。

链接时缺失了相关目标文件

首先编写如下的测试代码:


// test.h

#ifndef __TEST_H__
#define __TEST_H__

void test();

#endif

// test.c

#include <string.h>
#include <stdio.h>



void test()
{
    printf("just test it\n");
}

// main.c

#include "test.h"

int main(int argc, char **argv)
{
    test();

    return 0;
}

通过以下的命令,我们将会得到两个.o文件。

$ gcc -c test.c  
$ gcc –c main.c 

随后,我们将main.o这个文件,编译成可执行文件。

$ gcc -o main main.o
Undefined symbols for architecture x86_64:
  "_test", referenced from:
      _main in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

编译时报错了,这是最典型的undefined reference错误,因为在链接时发现找不到某个函数的实现文件。如果按下面这种方式链接就正确了。

$ gcc -o main main.o test.o

当然,也可以按照如下的命令编译,这样就可以一步到位。

$ gcc -o main main.c test.c

链接时缺少相关的库文件

我们把第一个示例中的test.c编译成静态库。

$ gcc -c test.c  
$ ar -rc test.a test.o 

接着编译可执行文件,使用如下命令:

$ gcc -o main main.c 
Undefined symbols for architecture x86_64:
  "_test", referenced from:
      _main in main-6ac26d.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

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

$ gcc -o main main.c test.a

链接的库文件中又使用了另一个库文件  (这个例子非常非常好, 我就是犯了这种错误!!!)

先更改一下第一个示例中使用到的代码,在test()中调用其它的函数,更改的代码如下所示。


// func.h

#ifndef __FUNC_H__
#define __FUNC_H__

void func();

#endif

// func.c

#include <stdio.h>

void func()
{
    printf("call it\n");
}

// test.h

#ifndef __TEST_H__
#define __TEST_H__

void test();

#endif

// test.c

#include <string.h>
#include <stdio.h>

#include "func.h"



void test()
{
    printf("just test it\n");

    func();
}

// main.c

#include "test.h"

int main(int argc, char **argv)
{
    test();

    return 0;
}

我们先对fun.ctest.c进行编译,生成.o文件。

$ gcc -c func.c  
$ gcc -c test.c

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

$ ar –rc func.a func.o  
$ ar –rc test.a test.o 

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

$ gcc -o main main.c test.a
Undefined symbols for architecture x86_64:
  "_func", referenced from:
      _test in test.a(test.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

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

$ gcc -o main main.c test.a func.a

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

多个库文件链接顺序问题

这种问题非常隐蔽,不仔细研究,可能会感到非常地莫名其妙。以第三个示例为测试代码,把链接库的顺序换一下,如下所示:

$ gcc -o main main.c 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的错误,完成编译链接。

备注:在MAC上可以正常编译通过。

定义与实现不一致

编写测试代码如下:


// test.h

#ifndef __TEST_H__
#define __TEST_H__

void test(unsigned int c);

#endif

// test.c

#include <string.h>
#include <stdio.h>



void test(int c)
{
    printf("just test it\n");
}

// main.c

#include "test.h"

int main(int argc, char **argv)
{
    test(5);

    return 0;
}

先将test.c编译成库文件。

$ gcc -c test.c 
$ ar -rc test.a test.o

main.c编译成可执行文件。

$ gcc -o main main.c test.a
ld: warning: ignoring file test.a, file was built for archive which is not the architecture being linked (x86_64): test.a
Undefined symbols for architecture x86_64:
  "_test", referenced from:
      _main in main-f27cf1.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

链接出错了,原因很简单,test()这个函数的声明和定义不一致导致,将两者更改成一样即可通过编译。

c++代码中链接c语言的库

代码同示例一的代码一样,只是把main.c更改成了main.cpp。编译test.c,并打包为静态库。

$ gcc -c test.c  
$ ar -rc test.a test.o

编译可执行文件,用如下命令:

$ g++ -o main main.cpp test.a 
Undefined symbols for architecture x86_64:
  "test()", referenced from:
      _main in main-7d7fde.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

原因就是main.cppc++代码,调用了c语言库的函数,因此链接的时候找不到,解决方法是在相关文件添加一个extern "C"的声明即可,例如修改test.h文件。


// test.h

#ifndef __TEST_H__
#define __TEST_H__

#ifdef __cplusplus
extern "C" {
#endif

void test();

#ifdef __cplusplus
}
#endif

#endif

S32K144 printf打印 undefined reference to `_write‘ S32K144使用printf的时候遇到如下问题,链接不到库。增加newlib,-specs=rdimon.specs。 阅读详情

相关推荐

代码编译报错`undefined reference to`:链接库缺失的3种解决方案

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

shejizuopin的博客 3588

C语言中编译相关的常见错误

1、/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crt1.o: In function `_start':   (.text+0x18):undefined reference to `main'   collect2: ld 返回 1   Reason: no main function in source file   2、to get compile options -I and -l   pkg-config lib   e.g: pkg-config –cflags –libs dbus-1

C++泛型模板函数编程中“undefined reference to”错误

问题: 在GCC下编写C++模板函数报undefined reference to错误,找了一系列文章研究。 一类是链接的问题 1. 链接时缺失了相关目标文件(.o) 2. 链接时缺少相关的库文件(.a/.so) 3. 链接的库文件中又使用了另一个库文件 4. 多个库文件链接顺序问题 5. 定义与实现不一致 6. 在C++代码中链接C语言的库 [转]"undefined refe...

huanghxyz的博客 9938

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

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

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

【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万+

6. "undefined reference to" 问题汇总解决方法 ------非常非常好的一篇文章

转载地址: https://segmentfault.com/a/1190000006049907?utm_source=tuicool&amp;utm_medium=referral在实际编译代码的过程中,我们经常会遇到"undefined reference to"的问题,简单的可以轻易地解决,但有些却隐藏得很深,需要花费大量的时间去排查。工作中遇到了各色各样类似的问题,按照以下几种可能出现的...

houshaoyun的博客 6981

undefined reference to `vtable for’”问题的原因及解决方法

如果使用QtCreator创建类时,没有选择继承自QObject类或其子类,而在创建后手工修改继承自QObject并手工添加Q_OBJECT宏,则在编译时有可能会出现"undefined reference to `vtable for’…有时候,手快(尤其程序员非常迷恋快捷键【doge】),会不小心跳过一些关键步骤,导致出现一些问题。如果添加后,没有马上编译,而是编写了很多业务代码后编译,才发现qt给你报了大量错误。经过自己摸索,还有网友的提示,总结了一些方法供大家参考。

工作学习记录 8万+

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

在软件开发过程中,特别是在C/C++编程中,"undefined reference to"是一个常见且令人头疼的错误。这个问题通常是在链接阶段出现的,它意味着编译器找不到函数或变量的定义。本文将详细探讨这个问题的背景,分析所有可能的情况,并提供相应的解决方案。

科技改变人类,技术成就未来 7386

gcc “undefined reference to问题解决方法

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

喜欢打篮球的普通人 5455

undefined reference to问题解决方法

"undefined reference to" 问题解决方法 aiwoziji13 2012-03-07 20:13:45 ...

Clarence的博客 3152

编译错误“ 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万+

关于使用protobuf出现undefined reference问题

菜就是菜,解决一个undefined reference都用这么长时间。 最近计划边学边写一个基于protobuf的RPC框架,结果第一步就遇到这个问题了。网上找了好久才一步一步解决问题,看来还有很长的路要走。         首先参考了这篇博客http://www.cppblog.com/colorful/archive/2012/05/05/173761.html,是protobuf库的问题

jaybroker的博客 1万+

undefined reference to xxx“ 问题解决思路

1、这个问题的根因是什么? 首先看一下这个错误提示的一个翻译:"undefined reference to xxx",未定义的引用xxx,我们知道编译器在生成可执行文件的过程包括预处理、编译、汇编、链接,这四个过程,这个问题的一般出现在链接过程,所谓的链接过程,就是把不同的目标文件粘合在一起,生成一个整体;实际应用过程中最常见的就是将不同的库文件进行链接生成可执行文件,每个库文件代表一个目标文件,比如我们libaaa.a库里有用到库libbbbb.a中定义的函数foo,我们称目标文...

hhaijiuwo的博客 7579

undefined reference to symbol xxxxx和undefined symbol:xxxx错误的原因分析以及解决方法

Linux下编译程序时,经常会遇到“undefined reference to XXX” 报错,或者运行时出现undefined symbol:xxxx报错。 这里总结一些可能的原因和解决方案,给需要的朋友: 说到这两个错误,必须先提一下Linux gcc链接规则: 编译源代码时,链接的时候查找顺序是: (1) -L 指定的路径, 从左到右依次查找 (2) 由环境变量 LIBRARY_PATH...

明天你好 1万+

flex的使用以及undefined reference to `yywrap'问题解决

新建文本文档,改名为a.l,编辑该文件,然后使用DOS命令flex a.l,生成lex.yy.c 文件,在DOS命令中输入 gcc -o output.exe lex.yy.c 生成optput.exe文件,出现了undefined reference to `yywrap’问题。 源代码如下 %{ /*********** Sexy Lexy ***********/ %} %% a+...

weixin_43695560的博客 5510

undefined reference to symbol ‘dlsym@@GLIBC_2.4‘ 解决

下面来看一下我编译时报错的信息 下面我再给出一个代码,大家运行一下 #include <stdio.h> void test(void) { printf("Hello World"); } //保存以.c文件,并且以gcc -fPIC --shared a.c -o liba.so 运行 下面再运行一个代码 #include <stddef.h> #include <dlfcn.h> int main(void) { void *handle =

努力学习 1万+

undefined reference to glut*WithExit之类的函数问题的原因及解决

从百度空间 翻出来的文章,希望大家不会在这样的问题上,浪费很多时间。 undefined reference to glut*WithExit之类的函数问题的原因及解决 现象: D:\CodeBlocks\MinGW\include\GL\freeglut_std.h|610|undefined reference to `__imp____glutInitWi

wuanshi5的专栏 4206

ubuntu undefined reference to 问题解决方法

发现除了/usr/lib/x86_64-linux-gnu之外,Anaconda安装目录/lib下面libffi.so.7。或 $ find /usr/lib/ -name "libffi.so*"/lib/x86_64-linux-gnu/libwayland-client.so | grep ffi 发现依赖libffi.so.7。1.观察报错:大概是libwayland-client.so.0找不到LIBFFI_BASE_7.0,可见库与ffi有关。4.查看这两个库:# 查看系统的libffi。

天下对手教会少林武僧 2903
上一篇: 如何用C/C++程序获取博客的访问量和积分信息
下一篇: 静态库调用静态库&静态库加载静态库------谈谈undefined reference to和linker input file unused because linking not done
涛歌依旧
涛歌依旧 优质创作者: 后端开发技术领域 优质创作者: 后端开发技术领域 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄14年 28万+粉丝 2592原创
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值