[lz@localhost ~]$ chmod 744 file1
[lz@localhost ~]$ ./file1
please input the value of i :
4
the sqrt of i is 2.
[lz@localhost ~]$ ldd file1
linux-vdso.so.1 => (0x00007fff22b60000)
libm.so.6 => /lib64/libm.so.6 (0x00000037b7200000)
libc.so.6 => /lib64/libc.so.6 (0x00000037b6a00000)
/lib64/ld-linux-x86-64.so.2 (0x00000037b6200000)
[lz@localhost ~]$ rm file1
[lz@localhost ~]$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib64
[lz@localhost ~]$ gcc -o file1 file1.c
/tmp/cctalcbc.o: In function `main':
file1.c:(.text+0x43): undefined reference to `sqrt'
collect2: ld returned 1 exit status
问题是这样的:file1.c 调用了 math.h中的函数
gcc -o file1 file1.c -lm 这样运行成功,但谁也不能知道每个库函数lib后的字母是什么 进而可以-l这样动态的链接。
所以 我想把LD_LIBRARY_PATH赋值(先只是暂时赋值)ldd命令查看libm.so.6 => /lib64/libm.so.6 (0x00000037b7200000)库函数/lib64目录下,所以 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib64 希望它可以动态链接。
但结果仍是:file1.c:(.text+0x43): undefined reference to `sqrt'
求解答:
我现在想知道:
1.c函数库 对应linux的路径名 即math.h 对应 -lm(这样就行 我听人说 网上有这样的表格)
2.我就想知道c库函数的路径:/usr/lib 什么的 我几乎所有的都试了/lib64:/lib:/usr/lib64:/usr/lib:/usr/local/lib这些都不好使,我用的是[红帽企业Linux.6.4.服务器版]的镜像。
知道一条也行
7 个解决方案
#1
1、不知道使用的函数在哪个动态库上,可以man一下,里面都写有要链接哪个库,比如你这里用的sqrt,
man sqrt的前几行如下:
再比如:
man pthread_create
这里面都有写link with XXX了。
2、LD_LIBRARY_PATH环境变量是指定链接器可以在哪个目录查看动态库,而程序要连接哪个动态库是由-l参数指定的,链接器不会自动去找。
man sqrt的前几行如下:
SQRT(3) Linux Programmer's Manual SQRT(3)
NAME
sqrt, sqrtf, sqrtl - square root function
SYNOPSIS
#include <math.h>
double sqrt(double x);
float sqrtf(float x);
long double sqrtl(long double x);
Link with -lm.
再比如:
man pthread_create
PTHREAD_CREATE(3) Linux Programmer's Manual PTHREAD_CREATE(3)
NAME
pthread_create - create a new thread
SYNOPSIS
#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
Compile and link with -pthread.
这里面都有写link with XXX了。
2、LD_LIBRARY_PATH环境变量是指定链接器可以在哪个目录查看动态库,而程序要连接哪个动态库是由-l参数指定的,链接器不会自动去找。
#2
写错了一个字:查找动态库,不是查看
#3
您回答的对我帮助很大,
但有的用man好像没啥用,我man strcpy
它并未说 link with ... 这时候怎么办?
第二条您说的 LD_LIBRARY_PATH环境变量是指定链接器可以在哪个目录查看动态库,而程序要连接哪个动态库是由-l参数指定的
是不是就是说 在/etc/profile 或 .bash_proflie 中设置LD_LIBRARY_PATH环境变量 都不能使程序自动连接 函数库;
那您知道有什么 方法可以有效地自动连接函数库。用到库函数多的时候 总用-l连接不是很方便吧。
但有的用man好像没啥用,我man strcpy
它并未说 link with ... 这时候怎么办?
第二条您说的 LD_LIBRARY_PATH环境变量是指定链接器可以在哪个目录查看动态库,而程序要连接哪个动态库是由-l参数指定的
是不是就是说 在/etc/profile 或 .bash_proflie 中设置LD_LIBRARY_PATH环境变量 都不能使程序自动连接 函数库;
那您知道有什么 方法可以有效地自动连接函数库。用到库函数多的时候 总用-l连接不是很方便吧。
#4
PATH只是指明路径
在编译时只要加上 -lm 这样简写就行,
若没有配置LIB_PATH环境等,则编译时 需要加全路径
另外除了最基本的库是不用连的以外,
用到别的库(.a/.so)函数都是要在编译时加上 -lm or -L /lib64 -lm 等
编译一下他就会报哪些函数找不到了 ,加入相应的库就行了
可以看看makefile教程
在编译时只要加上 -lm 这样简写就行,
若没有配置LIB_PATH环境等,则编译时 需要加全路径
另外除了最基本的库是不用连的以外,
用到别的库(.a/.so)函数都是要在编译时加上 -lm or -L /lib64 -lm 等
编译一下他就会报哪些函数找不到了 ,加入相应的库就行了
可以看看makefile教程
#5
指定头文件,再makefile中用 -I 指定。
静态库和动态库方式一样,都是 -L 路径, -lxxx 库
静态库和动态库方式一样,都是 -L 路径, -lxxx 库
#6
用到库函数也不是全都用-l,一些基本的像内存操作字符串操作这些都不用加-l,man strcpy没有说link with ...就说明它不需要用动态库。
#7
那是不在linux 编写c和c++时 不必过分担心链接库文件的问题,一部分不需要动态链接库,另一部分编译时需要链接库,用命令 man 即可解决
#1
1、不知道使用的函数在哪个动态库上,可以man一下,里面都写有要链接哪个库,比如你这里用的sqrt,
man sqrt的前几行如下:
再比如:
man pthread_create
这里面都有写link with XXX了。
2、LD_LIBRARY_PATH环境变量是指定链接器可以在哪个目录查看动态库,而程序要连接哪个动态库是由-l参数指定的,链接器不会自动去找。
man sqrt的前几行如下:
SQRT(3) Linux Programmer's Manual SQRT(3)
NAME
sqrt, sqrtf, sqrtl - square root function
SYNOPSIS
#include <math.h>
double sqrt(double x);
float sqrtf(float x);
long double sqrtl(long double x);
Link with -lm.
再比如:
man pthread_create
PTHREAD_CREATE(3) Linux Programmer's Manual PTHREAD_CREATE(3)
NAME
pthread_create - create a new thread
SYNOPSIS
#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
Compile and link with -pthread.
这里面都有写link with XXX了。
2、LD_LIBRARY_PATH环境变量是指定链接器可以在哪个目录查看动态库,而程序要连接哪个动态库是由-l参数指定的,链接器不会自动去找。
#2
写错了一个字:查找动态库,不是查看
#3
您回答的对我帮助很大,
但有的用man好像没啥用,我man strcpy
它并未说 link with ... 这时候怎么办?
第二条您说的 LD_LIBRARY_PATH环境变量是指定链接器可以在哪个目录查看动态库,而程序要连接哪个动态库是由-l参数指定的
是不是就是说 在/etc/profile 或 .bash_proflie 中设置LD_LIBRARY_PATH环境变量 都不能使程序自动连接 函数库;
那您知道有什么 方法可以有效地自动连接函数库。用到库函数多的时候 总用-l连接不是很方便吧。
但有的用man好像没啥用,我man strcpy
它并未说 link with ... 这时候怎么办?
第二条您说的 LD_LIBRARY_PATH环境变量是指定链接器可以在哪个目录查看动态库,而程序要连接哪个动态库是由-l参数指定的
是不是就是说 在/etc/profile 或 .bash_proflie 中设置LD_LIBRARY_PATH环境变量 都不能使程序自动连接 函数库;
那您知道有什么 方法可以有效地自动连接函数库。用到库函数多的时候 总用-l连接不是很方便吧。
#4
PATH只是指明路径
在编译时只要加上 -lm 这样简写就行,
若没有配置LIB_PATH环境等,则编译时 需要加全路径
另外除了最基本的库是不用连的以外,
用到别的库(.a/.so)函数都是要在编译时加上 -lm or -L /lib64 -lm 等
编译一下他就会报哪些函数找不到了 ,加入相应的库就行了
可以看看makefile教程
在编译时只要加上 -lm 这样简写就行,
若没有配置LIB_PATH环境等,则编译时 需要加全路径
另外除了最基本的库是不用连的以外,
用到别的库(.a/.so)函数都是要在编译时加上 -lm or -L /lib64 -lm 等
编译一下他就会报哪些函数找不到了 ,加入相应的库就行了
可以看看makefile教程
#5
指定头文件,再makefile中用 -I 指定。
静态库和动态库方式一样,都是 -L 路径, -lxxx 库
静态库和动态库方式一样,都是 -L 路径, -lxxx 库
#6
用到库函数也不是全都用-l,一些基本的像内存操作字符串操作这些都不用加-l,man strcpy没有说link with ...就说明它不需要用动态库。
#7
那是不在linux 编写c和c++时 不必过分担心链接库文件的问题,一部分不需要动态链接库,另一部分编译时需要链接库,用命令 man 即可解决