Ubuntu gcc错误:对'log'等函数未定义的引用

a.c 
#include <stdio.h>
#include <math.h>
int main()
{
    float a;
    void print_logarithm(double);
    printf("enter a num:");
    scanf("%f",&a);
    print_logarithm(a);
    return 0;
}
void print_logarithm(double x)
{
    if(x<=0.0)
    {
        printf("Positive numbers only,please.\n");
        return;
    }
    printf("The log of x is %f",log(x));
}

Ubuntu gcc编译

直接命令gcc -Wall a.c

1 linuxidc.com@linuxidc:~$ gcc -Wall a.c
2 /tmp/ccmKjOLq.o:在函数‘print_logarithm’中:
3 a.c:(.text+0x97):对‘log’未定义的引用
4 collect2: error: ld returned 1 exit status

查了一下发现:主要是C/C++编译为obj文件的时候并不需要函数的具体实现,只要有函数的原型即可。但是在链接为可执行文件的时候就必须要具体的实现了。验证如下:

1 linuxidc.com@linuxidc:~$ gcc -Wall -c a.c
2 linuxidc.com@linuxidc:~$ gcc -Wall -o a a.o
3 a.o:在函数‘print_logarithm’中:
4 a.c:(.text+0x97):对‘log’未定义的引用
5 collect2: error: ld returned 1 exit status
6 linuxidc.com@linuxidc:~$

编译时没有问题,链接生成可执行文件时报错。接下来加上-lm。 链接成功,如下:

1 linuxidc.com@linuxidc:~$ gcc -Wall -o a a.o -lm
2 linuxidc.com@linuxidc:~$

注意1:-lm要加在编译文件后面。

这个主要的原因是gcc编译的时候,各个文件依赖顺序的问题。在gcc编译的时候,如果文件a依赖于文件b,那么编译的时候必须把a放前面,b放后面。

注意2:sqrt()函数也是<math.h>头文件中的函数,但sqrt函数的使用没有以上限制,即编译时不加-lm也可以。

Linux升级GCC 4.8.1清晰简明教程(Ubuntu 12.04 64位版为例)  http://www.linuxidc.com/Linux/2014-04/99583.htm

Ubuntu 14.04 LST安装GCC 4.1.2  http://www.linuxidc.com/Linux/2016-06/132040.htm

Ubuntu 16.04 下将GCC-5.4降级到 4.8  http://www.linuxidc.com/Linux/2017-07/145502.htm

CentOS6.5升级手动安装GCC4.8.2  http://www.linuxidc.com/Linux/2015-01/112595.htm

Ubuntu升级GCC版本 http://www.linuxidc.com/Linux/2016-11/136840.htm

CentOS7环境下在/离线安装GCC与GCC-C++  http://www.linuxidc.com/Linux/2017-03/142319.htm

Ubuntu 16.04 LTS 降级安装GCC 4.8  http://www.linuxidc.com/Linux/2017-03/142299.htm

本文永久更新链接地址http://www.linuxidc.com/Linux/2017-09/147168.htm

Ubuntu gcc错误:对'log'等函数未定义的引用的更多相关文章

  1. gcc/g++ 编译时出现:“对’xxxx’未定义的引用,collect2: error: ld returned 1 exit status” 的错误

    出现的问题: 在使用 make 编译实现一个程序时,出现了下面的错误.查看程序源文件所在的目录时发现程序已经完成了编译,并生成了 list_repo.o 的文件,说明是在程序链接生成可执行文件时发生了 ...

  2. gcc编译时对'xxxx'未定义的引用问题

    gcc编译时对’xxxx’未定义的引用问题 gcc编译时对’xxxx’未定义的引用问题 原因 解决办法 gcc 依赖顺序问题 在使用gcc编译的时候有时候会碰到这样的问题,编译为.o(obj) 文件没 ...

  3. gcc编译时对’xxxx’未定义的引用问题

    gcc编译时对’xxxx’未定义的引用问题 原因 解决办法 gcc 依赖顺序问题 在使用gcc编译的时候有时候会碰到这样的问题,编译为.o(obj) 文件没有问题,但是编译(这一步应该是链接)为可执行 ...

  4. C语言中未定义的引用错误

    1.错误描述: /tmp/ccAu32Cb.o:在函数‘main’中:static.c:(.text+0x2d):对‘print_value’未定义的引用 2.通过对错误内容分析,我在编写程序时,ma ...

  5. GCC 高版本7.4 编译链接 boost 报错 boost::thread::XXX’未定义的引用 解决方法

    背景:开发中的项目之前一直用GCC4.8,boost库1.48版本的开发环境.现在因业务需求,需要更换GCC7.4,boost库1.70. 问题:可以正常编译BOOST的链接库文件,但是链接时候报错. ...

  6. 【转】 g++编译时对'xxxx'未定义的引用问题(undefined reference to)

    转自:https://blog.csdn.net/killwho/article/details/53785910 引用:http://www.linuxdiyf.com/linux/16754.ht ...

  7. 多线程编程-pthread 未定义的引用

    多线程编程时用到函数库 pthread.h ,但是该函数库不是linux默认的函数库,所以编译c文件时,需要在目标代码文件后加上 -lpthread参数. 1.未加上 -lpthread 编译时,报错 ...

  8. 编译lua5.3.2报错提示libreadline.so存在未定义的引用解决方法

    从官网上下载5.3.2的源码后,make linux进行编译,提示报错: gcc -std=gnu99 -o lua lua.o liblua.a -lm -Wl,-E -ldl -lreadline ...

  9. (原)编译caffe时提示未定义的引用(undefined reference to)

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5864715.html 参考网址: https://github.com/BVLC/caffe/issu ...

随机推荐

  1. JavaScript------一元运算符+的使用

    var y = "5"; // y 是一个字符串 var x = + y; // x 是一个数字 var y = "John"; // y 是一个字符串 var ...

  2. 利用Fiddler或Charles进行mock数据

    使用场景:服务器数据不符合测试条件时,我们可以通过在本地创建虚拟数据来打到测试用例所描述的条件. fiddler使用方法 1.首先在本地创建txt数据:将抓到的response中的json数据拷贝到记 ...

  3. jQuery的validate验证插件使用方法

    (1)默认校验规则(1)required:true 必输字段(2)remote:"check.php" 使用ajax方法调用check.php验证输入值(3)email:true ...

  4. 【BZOJ4567】[Scoi2016]背单词 Trie树+贪心

    [BZOJ4567][Scoi2016]背单词 Description Lweb 面对如山的英语单词,陷入了深深的沉思,“我怎么样才能快点学完,然后去玩三国杀呢?”.这时候睿智 的凤老师从远处飘来,他 ...

  5. Win10-64位 免安装版Mysql8下载安装运行

    今天忙活了很久去下载安装Mysql,感觉网上的那些教程怎么都对不上呢,很奇怪,不过我乱点一通至少能用了,先凑和着用吧... 记录一下, 要是不对的,以后再修改...windows10系统 2018-5 ...

  6. 《挑战程序设计竞赛》2.2 贪心法-其它 POJ3617 3069 3253 2393 1017 3040 1862 3262

    POJ3617 Best Cow Line 题意 给定长度为N的字符串S,要构造一个长度为N的字符串T.起初,T是一个空串,随后反复进行下列任意操作: 从S的头部(或尾部)删除一个字符,加到T的尾部 ...

  7. 4.php奇葩的地方,反引号``

    今天我发现我从来没打过这外符号 ` 就是键盘的左上方, 1的左边不需要组合键, 直接按下即可.... 刚开始我还一直在找没找到.....百度一下.才知道

  8. Vulnerabilities by Type

    w http://hackergossips.com/cross-site-scriptingxss-and-preventing/

  9. SQL小练习

    1.现在有两张表订单表TB_ORDER,包括字段:order_id(订单号),username(用户名),amount(订单金额),order_time(下单时间), product_id(商品ID) ...

  10. Js 实现ajax

    一.JS实现的ajax 1.AJAX核心(XMLHttpRequest) 其实AJAX就是在Javascript中多添加了一个对象:XMLHttpRequest对象.所有的异步交互都是使用XMLHtt ...