gcc编译包含数学函数的C代码时遇到的异常及解决-程序员宅基地

技术标签: gcc报libc.so when searching for -lc  c  c语言  gcc编译报undefined reference to  linux C编译报错  

[b]引言:[/b]

最近对C语言来了兴趣,业余了解体验了一下。在使用gcc编译时遇到两个异常很有意思,留下此篇希望能帮到和我一样的新手们。

异常信息是:
1)undefined reference to `sin'
2)/usr/bin/ld: skipping incompatible /usr/lib/libc.so when searching for -lc


[b]正文:[/b]

首先上段源代码:
#include <stdio.h>
#include <math.h>

#define INT_COUNT 20

double f(int x);

int main(int argc, char *argv[]){
int i;
double results[INT_COUNT];

results[0] = f(1);
printf("%e\n", results[0]);

return 0;
}

double f(int x){
double result = 0.0, d;

d = 1.0 * x;
result = d - sin(d) - cos(d);

return result;
}


问题1:
[zhaoningbo@officetest1 CLang]$ gcc maxValue.c -o maxValue.out
/tmp/cc0QRY70.o: In function `f':
maxValue.c:(.text+0x48): undefined reference to `sin'
maxValue.c:(.text+0x70): undefined reference to `cos'
collect2: ld 返回 1
[zhaoningbo@officetest1 CLang]$

这个问题网上的资料比较多,一查便可知道“这种错误一般是由于缺少库造成的.使用-lm即可”。的确到此问题可以解决了。

问题2:
笔者在自己虚拟机解决完问题1后,编译成功了。却在测试服务器上,报了如下信息:
[zhaoningbo@officetest1 CLang]$ gcc maxValue.c -lm -L/lib -L/usr/lib -o maxValue.out
/usr/bin/ld: skipping incompatible /usr/lib/libm.so when searching for -lm
/usr/bin/ld: skipping incompatible /usr/lib/libm.a when searching for -lm
/usr/bin/ld: skipping incompatible /usr/lib/libc.so when searching for -lc
/usr/bin/ld: skipping incompatible /usr/lib/libc.a when searching for -lc
[zhaoningbo@officetest1 CLang]$

这是怎么回事呢?虚拟机用的32位系统,测试服务器是64位,于是一搜就有解决方法了。具体如下:

[zhaoningbo@officetest1 CLang]$ gcc maxValue.c -lm -L/lib64 -L/usr/lib64 -o maxValue.out
[zhaoningbo@officetest1 CLang]$ ./maxValue.out
-3.817733e-01
[zhaoningbo@officetest1 CLang]$

至此问题解决了。

最后推荐一个新手群(当然里面有高手)186660469。这是我找的最像C语言新手学习群的群 ~。=


[b]引用:[/b]

1)[url=http://hi.baidu.com/jangill/blog/item/accb4a0825ad883ce82488e2.html]问题1解决方法[/url]
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhao_ningbo/article/details/84154228

智能推荐

C语言中的数据类型及其转换详解_枚举常量如果超过int,会转化为long int-程序员宅基地

文章浏览阅读8.2k次。1. C语言中的数据类型  C语言中的类型按其组成可以分为简单类型和构造类型,按是否预定义了类型名字和值集可以分为基本类型和非基本类型,按是否加了类型限定符可以分为限定类型和非限定类型。  ANS_枚举常量如果超过int,会转化为long int

Linux中的伪终端编程_pty.h-程序员宅基地

文章浏览阅读1.1k次。[cpp] view plain copy如何操作伪终端: 伪终端的使用是成对出现的,分为master 和 slaver 主设备:/dev/ptmx (i850上的主设备名) 从设备:动态生成:/dev/pts/0.......x 功能:写入主设备的信息,可以从从设备上读出;写入从设备的信息,可以从主设备读出。用以实现对串口的多路复用。 _pty.h

Hive-JDBC操作,springcloud高级面试题_springcould hive-jdbc-程序员宅基地

文章浏览阅读131次。hadoop.proxyuser.mengday.hosts * hadoop.proxyuser.mengday.groups * ```2. 启动hadoop> cd /usr/local/Cellar/hadoop/3.2.1/sbin> ./start-all.sh> jps启动成功后注意查看DataNode节点是否启动起来, 经常遇到DataNode节点启动不成功。二:配置hive-..._springcould hive-jdbc

Mac在有S.M.A.R.T错误的情况下安装OSX系统_这个磁盘发生s.m.a.r.t.错误 此磁盘存在不能-程序员宅基地

文章浏览阅读5.6k次,点赞2次,收藏4次。根据实践经验总结的过程仅供参考(双系统方案)注:OSX为Mac使用的系统在最开始明确一下此方法的弊端以及适用情况**适用情况**:硬板本身具有S.M.A.R.T错误,无其他严重问题但无法安装OSX系统,现有可用的Windows系统(或者可用的PE),硬盘里没有重要的文件(任何文件),有装系统的经验。弊端:只能用于安装最原始版本的OSX,即买回来时安装的版本,且因为新版的系统会自..._这个磁盘发生s.m.a.r.t.错误 此磁盘存在不能

毕业论文管理系统(类图、ER图)、时序图-程序员宅基地

文章浏览阅读3k次。类图ER图转载于:https://www.cnblogs.com/jjw98/p/8706952.html_毕业论文管理系统时序图

字符串拼接之StringBuilder和string的区别_stringbuilder 和 字面量拼接有什么区别-程序员宅基地

文章浏览阅读3.3k次,点赞2次,收藏7次。字符串是我们使用最多的数据类型,有时一些操作需要做大量的字符串拼接,下面分析一下做字符串拼接时StringBuilder和string的区别。1、string:首先,string是引用类型,存放在堆内存中,有“不可变性”的特性(驻留池机制),但是在做字符串拼接时,每次都会创建一个新对象,也就是每次都要去申请内存空间,因为做大量字符串拼接时性能很差,只适合做少量的字符串拼接。=》简单演示:才_stringbuilder 和 字面量拼接有什么区别

随便推点

springmvc-servlet.xml中use-default-filters的作用-程序员宅基地

文章浏览阅读249次。在ssm整合时,使用注解方式对相关bean进行管理,此时会出现一个问题SpringIOC容器和SpringMVC容器这两个容器对Bean管理的问题,一般情况下都是单单使用SpringMVC容器对@Controller注解标识的类进行管理,其他的类如@Service、@Component、@Repository等注解标识的类由Spring容器来管理(SpringMVC容器中的类可以引用...

2021年全网最细 VirtualBox 虚拟机安装 Ubuntu 20.04.2.0 LTS及Ubuntu的相关配置_2021年全网最细virtualbox安装ubuntu-程序员宅基地

文章浏览阅读2.4w次,点赞107次,收藏478次。目录一、VirtualBox 虚拟机的安装1. VirtualBox 的下载和安装2. 设置 VirtualBox 存储文件夹3. 在 VirtualBox 创建虚拟机二、Linux 操作系统(Ubuntu)的安装1. Linux 操作系统(Ubuntu)的下载2. 安装 Ubuntu3. 启动 Ubuntu三、配置 Ubuntu1. 设置终端2. 设置共享剪贴板3. 设置共享文件夹一、VirtualBox 虚拟机的安装VirtualBox 是由德国 Innotek 公司开发,由 Sun Microsy_2021年全网最细virtualbox安装ubuntu

CMake 官方完整版_cmake 文档-程序员宅基地

文章浏览阅读541次。假设,出于教学的目的,我们决定不使用平台log和exp函数,而是希望生成一个预先计算值的表,以便在mysqrt函数中使用。在本节中,我们将创建表作为构建过程的一部分,然后将该表编译到我们的应用程序中。首先,让我们删除中对log和exp函数的检查。然后从mysqrt.cxx中删除对HAVE_LOG和HAVE_EXP的检查。同时,我们可以删除。在子目录中,有一个名为的新源文件被提供来生成表格。检查完文件后,我们可以看到表是作为有效的 C++ 代码生成的,并且输出文件名作为参数传入。下一步是创建。_cmake 文档

STM8停产,新唐的N76E003 pin对pin替换STM8S003F3P6_stm8s003 pin对pin 代替-程序员宅基地

文章浏览阅读3.9k次。版权声明:本文为CSDN博主「qlexcel」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/qlexcel/article/details/81069808随着STM8的停产,新唐的N76E003 pin对pin替换STM8S003F3P6,而且很便宜,故这个时候拿来替换使用再好不过。下面..._stm8s003 pin对pin 代替

【测试用例】测试用例设计方法论之KYM、MFQ、PPDS_kym模板-程序员宅基地

文章浏览阅读4.7k次,点赞15次,收藏24次。目 录一KYM:Know Your Mission1.1 用户维度1.2 产品维度1.3任务维度二 MFQ2.1单一功能(PPDS)2.2 功能交互2.3 质量属性一KYM:Know Your MissionKYM是Kown Your Mission的简称,顾名思义,就是帮助用例设计人员梳理测试任务的过程,它是一种系统的收集和整理测试启发的框架。在接触一些新事物或者面对一些新问题时,人们往往更关注与问题本身,也就是what,而忽略了问题产生的原因(why)和..._kym模板

【精通内核】CPU控制并发原理CPU中断控制内核解析_cpu 并发控制-程序员宅基地

文章浏览阅读1.8w次,点赞94次,收藏161次。本文讲解CPU角度的中断控制,CPU层面并行并发和中断控制的原理,现代CPU的缓存结构和架构图、CPU缓存一致性的源码原理,以及CPU如何通过编译器的屏障与指令实现系统屏障,经过内联汇编代码验证之后,证明上述所说的 Linux 内核用 volatile 关键字实现系统屏障(指令重排),加深对系统屏障的内核源码和原理的理解_cpu 并发控制

推荐文章

热门文章

相关标签