gcc编译出现undefined reference to 的问题

拓展程序功能,并用gcc编译,结果在添加了库<math.h>后出现问题

gcc -o main main.c

编译错误提示:

/usr/bin/ld: /tmp/cckwgwIa.o: undefined reference to symbol 'sin@@GLIBC_2.2.5'
/lib/x86_64-linux-gnu/libm.so.6: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

经过查找资料,发现了问题出现的原因:

main.c中使用了Sin_Calcu()来计算sin值

函数具体定义在Signal.c中

函数实现中使用了<math.h>中sin()方法

所以形成了 main.c -> Signal.c ->math.h 的调用关系

结果在链接过程中 main.c 就找不到 math.h 中的 sin() 函数定义了

解决方法:

gcc -o main main.c -lm

显式链接到math.h

这样就编译通过啦

感谢大家的博客,让我弄懂了这个问题。同时,也学到不少其他东西,列在下面:

1.什么是编译,链接
    参考链接:http://www.cprogramming.com/compilingandlinking.html


编译就是把C/C++的高级语言翻译成机器语言指令,编译过程是对独立的文件,并不检查函数的定义放在什么地方,也不会生成可以执行的文件,通常是生成.o(.obj)这样的文件。

链接则要根据.o文件生成可执行的程序或库。函数未定义这样的错误都是在链接过程中产生的。编译过程如果找不到一个函数的定义,它会认为这个函数的定义放在其它文件,而链接则一定要找到第个函数的定义。
这样多个库文件在链接时就有了依赖性的问题。


2.检查binutils的版本

ld -v

binutils2.22开始,其中的ld开始把--no-copy-dt-needed-entries默认打开,这样一来,ld不会再自动递归地解析链接的lib,而需要由用户来一一指定。

  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值