使用gcc的-l参数的时候,怎么查找函数所在库的位置

键盘输入一个整数n,接着输入n个实型数,分别求取这n个实型数的平方根。代码如下:

使用gcc编译,报错如下:

原因是没有链接数学库,加上-lm即可,-l是链接,m是数学库(math.h)

那我们怎么知道sqrt在哪个库呢?

centos7下使用:

nm -Do /lib64/*.so|grep sqrt

结果为:

/lib64/libm-2.17.so就是sqrt的动态链接库的位置,

找到后,只要gcc的-l参数后面加上上图中lib后面的那个字母即可,libm-2.17.so中m表示库名,2.17是版本。所以gcc上加-lm进行链接

Ubuntu64位使用:

nm -Do /lib/x86_64-linux-gnu/*.so|grep sqrt

因为Ubuntu的动态库是在 /lib/x86_64-linux-gnu 下,而centos是在 /lib64/下。

那一个陌生的linux怎么知道动态库在哪呢,数学库肯定叫libm,这时可以使用find命令对libm进行查找,这样就可以找到动态库的目录。

find / -name *libm*

说明当前系统的动态库.so在/usr/lib64/目录下,所以接下来要找函数在哪个库,只需要使用

 nm /lib64/*.so|grep 函数名 

即可。

/usr/lib64就是/lib64,因为/lib64是前者的链接文件(即快捷方式):

原文地址:https://www.cnblogs.com/FengZeng666/p/12432491.html

时间: 2024-11-05 19:03:48

使用gcc的-l参数的时候,怎么查找函数所在库的位置的相关文章

【C++编译】gcc的-l参数和-L参数

今天在编译服务的时候,出现了一个错误: /usr/bin/ld: cannot find -lxxx 于是查了一下,这个错误是因为链接程序ld在指定目录里找不到libxxx.so这个库. 那么,上面所说的"指定目录"是哪些目录,以及 -l的作用是什么呢? -l参数:用来指定程序要链接的库,-l参数紧接着就是库名.这里的库名并非真正的库文件名.以库名为math的库为例,他的库文件名是libmath.so或者libmath.a(Linux下的库文件都要以lib开头,其中.so是动态库,.a

gcc -l参数和-L参数

-l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是m,他的库文件名是libm.so,很容易看出,把库文件名的头lib和尾.so去掉就是库名了 好了现在我们知道怎么得到库名,当我们自已要用到一个第三方提供的库名字libtest.so,那么我们只要把libtest.so拷贝到/usr/lib里,编译时加上-ltest参数,我们就能用上libtest.so库了(当然要用libtest.so库里的函数,我们还需要与libtest.

linux下使用math.h头文件-l与-L参数

遇到一个问题就是,c语言用到sqrt时,明明已包含math.h文件,却仍提示未定义,所以上网招答案的: gcc -lm 以下转自http://bbs.csdn.net/topics/330105678 ·-l参数和-L参数 -l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是m,他的库文件名是libm.so,很容易看出,把库文件名的头lib和尾.so去掉就是库名了 好了现在我们知道怎么得到库名,当我们自已要用到一个第三方提供

linux下gcc编译的参数详细说明

参考网址:1 http://hi.baidu.com/zengzhaonong/item/f1f9383565fa5c302e0f8125 gcc使用方法 汇总 2 http://s99f.blog.163.com/blog/static/35118365201311261453629/ gcc参数区别 3    http://blog.csdn.net/ruglcc/article/details/7814546       makefile教程 刚接触linux下的C编程.以前做项目时,接触

gcc/g++ 常用参数

编译的步骤 参考:gcc参数详解 gcc and g++分别是gnu的c & c++编译器 gcc/g++在执行编译工作的时候,总共需要4步 1.预处理,生成.i的文件[预处理器cpp]. 对应的参数是 -E 2.将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs].对应的参数是 -S 3.有汇编变为目标代码(机器代码)生成.o的文件[汇编器as].对应的参数是 -c 4.连接目标代码,生成可执行程序[链接器ld].无参数. 编译步骤举例 有三个文件f1.h.f1.cc.test.c

GCC 中 -L、-rpath和-rpath-link的区别

GCC 中 -L.-rpath和-rpath-link的区别 来源 http://blog.csdn.net/q1302182594/article/details/42102961 关于这3个参数的说明,有不少资料,但是看完了还是觉得模糊,分不清它们的区别.本文将用实验的方法去探讨这3个参数的区别. 1.三个.c文件 1.1 world.c #include<stdio.h> void world(void) { printf("world.\n"); } 1.2 hel

iperf网络测试工具中 -l 参数的作用

当使用iperf工具进行网络测试时,客户端不使用-l 参数设置缓冲区大小,服务端不显示数据,当设置了-l 1k 时,服务端才显示数据是怎么回事呢?请问设置了缓冲区大小影响到了什么,从而导致了这个结果:图一为未加-l参数图二为加了-l参数 请有经验的朋友解惑啊? 原文地址:http://blog.51cto.com/13287875/2112644

volatile,可变参数,memset,内联函数,宽字符窄字符,国际化,条件编译,预处理命令,define中##和#的区别,文件缓冲,位域

 1.volatile:要求参数修改每次都从内存中的读取.这种情况要比普通运行的变量需要的时间长. #include <stdio.h> #include <stdlib.h> #include <time.h> void main() { time_t start, end; double res = 0; time(&start);  //获取时间,传递给start //volatile强制每次从内存读取 volatile int i; for (i =

求变量的数据类型,typeid,bool,C和C++的不同,new和delete,C++中的枚举,inline和可变参数模板,auto和函数模板,宽字符

求变量的数据类型,通过函数typeid(变量名).name();获得变量的数据类型. 案例如下: #include <iostream> #include <stdlib.h> void main() { double db = 10.9; double *pdb = &db; auto num = pdb; //通过typeid的方式获得数据类型 std::cout << typeid(db).name() << std::endl; std::c