Linux 下 c 的函数库路径问题

时间:2022-11-26 07:38:53
[lz@localhost ~]$ gcc -o file1 file1.c /lib64/libm.so.6 
[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的前几行如下:

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


引用 1 楼 wangzuxi 的回复:
1、不知道使用的函数在哪个动态库上,可以man一下,里面都写有要链接哪个库,比如你这里用的sqrt,
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参数指定的,链接器不会自动去找。

写错了一个字:查找动态库,不是查看

#3


您回答的对我帮助很大,
但有的用man好像没啥用,我man strcpy Linux 下 c 的函数库路径问题
它并未说 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教程 

#5


指定头文件,再makefile中用 -I 指定。

静态库和动态库方式一样,都是 -L 路径, -lxxx  库

#6


引用 3 楼 qq_25103581 的回复:
您回答的对我帮助很大,
但有的用man好像没啥用,我man strcpy Linux 下 c 的函数库路径问题
它并未说 link with ... 这时候怎么办?
第二条您说的 LD_LIBRARY_PATH环境变量是指定链接器可以在哪个目录查看动态库,而程序要连接哪个动态库是由-l参数指定的
是不是就是说 在/etc/profile 或 .bash_proflie 中设置LD_LIBRARY_PATH环境变量 都不能使程序自动连接 函数库;
那您知道有什么 方法可以有效地自动连接函数库。用到库函数多的时候 总用-l连接不是很方便吧。

用到库函数也不是全都用-l,一些基本的像内存操作字符串操作这些都不用加-l,man strcpy没有说link with ...就说明它不需要用动态库。

#7


那是不在linux 编写c和c++时 不必过分担心链接库文件的问题,一部分不需要动态链接库,另一部分编译时需要链接库,用命令 man 即可解决

#1


1、不知道使用的函数在哪个动态库上,可以man一下,里面都写有要链接哪个库,比如你这里用的sqrt,
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


引用 1 楼 wangzuxi 的回复:
1、不知道使用的函数在哪个动态库上,可以man一下,里面都写有要链接哪个库,比如你这里用的sqrt,
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参数指定的,链接器不会自动去找。

写错了一个字:查找动态库,不是查看

#3


您回答的对我帮助很大,
但有的用man好像没啥用,我man strcpy Linux 下 c 的函数库路径问题
它并未说 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教程 

#5


指定头文件,再makefile中用 -I 指定。

静态库和动态库方式一样,都是 -L 路径, -lxxx  库

#6


引用 3 楼 qq_25103581 的回复:
您回答的对我帮助很大,
但有的用man好像没啥用,我man strcpy Linux 下 c 的函数库路径问题
它并未说 link with ... 这时候怎么办?
第二条您说的 LD_LIBRARY_PATH环境变量是指定链接器可以在哪个目录查看动态库,而程序要连接哪个动态库是由-l参数指定的
是不是就是说 在/etc/profile 或 .bash_proflie 中设置LD_LIBRARY_PATH环境变量 都不能使程序自动连接 函数库;
那您知道有什么 方法可以有效地自动连接函数库。用到库函数多的时候 总用-l连接不是很方便吧。

用到库函数也不是全都用-l,一些基本的像内存操作字符串操作这些都不用加-l,man strcpy没有说link with ...就说明它不需要用动态库。

#7


那是不在linux 编写c和c++时 不必过分担心链接库文件的问题,一部分不需要动态链接库,另一部分编译时需要链接库,用命令 man 即可解决