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

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

目录

  • **1. 链接时缺失了相关目标文件(.o)**
  • **2. 链接时缺少相关的库文件(.a/.so)**
  • **3. 链接的库文件中又使用了另一个库文件**
  • **4 多个库文件链接顺序问题**

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

编译maic.c,文件调用了test.c中的函数,通过命令行编译:

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)

假设有2个.c文件,其中一个调用了另外一个的函数。

先把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. 链接的库文件中又使用了另一个库文件

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

这种问题比较隐蔽,假设有3个.c文件,其中文件a调用了b的函数,而b的函数实现又调用了c。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

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

“undefined reference to“ 解决方法相关推荐

  1. [转]undefined reference to 问题解决方法

    "undefined reference to" 问题解决方法 转载地址:http://blog.csdn.net/aiwoziji13/article/details/73303 ...

  2. “undefined reference to“ 问题解决方法

    "undefined reference to" 问题解决方法 aiwoziji13 2012-03-07 20:13:45 603297 收藏 169 文章标签: referen ...

  3. php 正则报错,PHP正则替换函数preg_replace()报错:Notice Use of undefined constant的解决方法分析...

    本文实例讲述了PHP正则替换函数preg_replace()报错:Notice Use of undefined constant的解决方法.分享给大家供大家参考,具体如下: 环境错误级别:error ...

  4. [jQuery1.9]Cannot read property ‘msie’ of undefined错误的解决方法

    [jQuery1.9]Cannot read property 'msie' of undefined错误的解决方法 原文:[jQuery1.9]Cannot read property 'msie' ...

  5. [jQuery] Cannot read property ‘msie’ of undefined错误的解决方法

    [jQuery] Cannot read property 'msie' of undefined错误的解决方法 参考文章: (1)[jQuery] Cannot read property 'msi ...

  6. Notice: Undefined offset 的解决方法

    Notice: Undefined offset 的解决方法 参考文章: (1)Notice: Undefined offset 的解决方法 (2)https://www.cnblogs.com/ha ...

  7. Telink “undefined reference to“ 问题解决方法

    Telink "undefined reference to" 问题解决方法 基于Telink ble 相关芯片平台 再开发,编译后报"undefined referen ...

  8. undefined reference to 问题解决方法

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

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

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

最新文章

  1. 蚂蚁集团研究员王益:Go+ 可有效补全 Python 的不足
  2. 窗体调用 OCX 的使用方法(MFC,WINFORM)
  3. ionic build Android错误记录 error in opening zip file
  4. Java黑皮书课后题第8章:8.28(严格相同的数组)如果两个二维数组m1和m2相应的元素相等的话,则认为它们是严格地相同的。编写一个方法,如果m1和m2是严格相同的话,返回true
  5. 决策树:特征分布空间划分方法
  6. sm总线控制器找不到驱动程序_细说嵌入式系统下的驱动程序设计
  7. 欧几里得算法及扩展欧几里得算法简单解释
  8. 量化金融经典理论、重要模型、发展简史大全
  9. DHSNet: Deep Hierarchical Saliency Network for Salient Object Detection阅读总结
  10. Intellij IDEA 插件下载慢或无法查询
  11. 触宝电话推“免费拨打国际长途”新业务
  12. 茴香豆的茴字的几种写法——BOJ1302小结
  13. 【全是干货!伸手党福利】通过银行卡号判断出所属银行信息
  14. nodejs php 模板,玩转nodejs
  15. 一文读懂“什么是Web 1.0,Web 2.0,Web 3.0?”
  16. win10电脑声音调节图标上有个红叉
  17. Android工具修复属性,Broken Android Data Extraction(安卓数据修复工具) V3.0.20 官方版
  18. 串流直播流媒体视频发布平台功能模块和产品技术参数
  19. 什么是 infiniband
  20. 幻影路由服务器无响应,幻影D128路由器连不上网怎么办? | 192路由网

热门文章

  1. Method has to have one of the following return types
  2. java list 泛型 class_List 添加 Class 泛型
  3. Flutter Row 实例 —— 新手礼包
  4. 如何在高酸高铁盐环境下实现游离酸的回收?
  5. 计算机组成原理DROM,计算机组成原理附加习题—徐国雄教案.doc
  6. 如何成为一名自由职业的翻译
  7. 仿QQ界面设计类(CYisongRichEdit)(原创)
  8. 程序员的浪漫,教你用Python代码画圣诞树
  9. java实现打手机电话功能_Android 实现手机拨打电话的功能
  10. ide中项目的结构变乱后的解决办法