当前位置: 首页 > news >正文

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

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

转载于:https://www.cnblogs.com/Ph-one/p/7611096.html

相关文章:

  • error: 'for' loop initial declarations are only allowed in C99 mode
  • 浮点数比较大小的问题
  • 线性代数线性相关特例
  • +2开闭原则
  • (+4)2.2UML建模图
  • 2.1分层数据流
  • +6是不是用例越多越好?为什么说明原因
  • +1阿姆达尔定律
  • +2流水线是怎样提高性能的,会遇到什么问题,解决方法是什么
  • +3软件优化至关重要,软件优化一般有哪些方法?
  • +4 高速缓存
  • +5性能分析定律
  • +6存储结构是怎样提高性能的,它和局部性的关系是什么。
  • +7虚拟内存的作用,通过什么方式提高虚拟内存的性能
  • EFM32JG系列MCU内部温度传感器使用方法
  • JS 中的深拷贝与浅拷贝
  • 【翻译】babel对TC39装饰器草案的实现
  • axios 和 cookie 的那些事
  • IndexedDB
  • JavaScript设计模式与开发实践系列之策略模式
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • leetcode388. Longest Absolute File Path
  • mysql中InnoDB引擎中页的概念
  • vue 个人积累(使用工具,组件)
  • web标准化(下)
  • 使用common-codec进行md5加密
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 因为阿里,他们成了“杭漂”
  • 用element的upload组件实现多图片上传和压缩
  • # 计算机视觉入门
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • $NOIp2018$劝退记
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (C#)一个最简单的链表类
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (二)hibernate配置管理
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (附源码)计算机毕业设计ssm电影分享网站
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (四)鸿鹄云架构一服务注册中心
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (转)【Hibernate总结系列】使用举例
  • (转)ABI是什么
  • .a文件和.so文件
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NET Remoting学习笔记(三)信道
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池