Linux 下 c 的函数库路径问题

[复制链接]
查看11 | 回复7 | 2021-1-27 06:25:47 | 显示全部楼层 |阅读模式
[lz@localhost~]$gcc-ofile1file1.c/lib64/libm.so.6
[lz@localhost~]$chmod744file1
[lz@localhost~]$./file1
pleaseinputthevalueofi:
4
thesqrtofiis2.
[lz@localhost~]$lddfile1
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~]$rmfile1
[lz@localhost~]$exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib64
[lz@localhost~]$gcc-ofile1file1.c
/tmp/cctalcbc.o:Infunction`main':
file1.c:(.text+0x43):undefinedreferenceto`sqrt'
collect2:ldreturned1exitstatus
问题是这样的:file1.c调用了math.h中的函数
gcc-ofile1file1.c-lm这样运行成功,但谁也不能知道每个库函数lib后的字母是什么进而可以-l这样动态的链接。
所以我想把LD_LIBRARY_PATH赋值(先只是暂时赋值)ldd命令查看libm.so.6=>/lib64/libm.so.6(0x00000037b7200000)库函数/lib64目录下,所以exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib64希望它可以动态链接。
但结果仍是:file1.c:(.text+0x43):undefinedreferenceto`sqrt'
求解答:
我现在想知道:
1.c函数库对应linux的路径名即math.h对应-lm(这样就行我听人说网上有这样的表格)
2.我就想知道c库函数的路径:/usr/lib什么的我几乎所有的都试了/lib64:/lib:/usr/lib64:/usr/lib:/usr/local/lib这些都不好使,我用的是[红帽企业Linux.6.4.服务器版]的镜像。
知道一条也行
分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:25:47 | 显示全部楼层
1、不知道使用的函数在哪个动态库上,可以man一下,里面都写有要链接哪个库,比如你这里用的sqrt,
mansqrt的前几行如下:
SQRT(3)LinuxProgrammer'sManualSQRT(3)
NAME
sqrt,sqrtf,sqrtl-squarerootfunction
SYNOPSIS
#include
doublesqrt(doublex);
floatsqrtf(floatx);
longdoublesqrtl(longdoublex);
Linkwith-lm.
再比如:
manpthread_create
PTHREAD_CREATE(3)LinuxProgrammer'sManualPTHREAD_CREATE(3)
NAME
pthread_create-createanewthread
SYNOPSIS
#include
intpthread_create(pthread_t*thread,constpthread_attr_t*attr,
void*(*start_routine)(void*),void*arg);
Compileandlinkwith-pthread.
这里面都有写linkwithXXX了。
2、LD_LIBRARY_PATH环境变量是指定链接器可以在哪个目录查看动态库,而程序要连接哪个动态库是由-l参数指定的,链接器不会自动去找。
回复

使用道具 举报

千问 | 2021-1-27 06:25:47 | 显示全部楼层
引用1楼wangzuxi的回复:1、不知道使用的函数在哪个动态库上,可以man一下,里面都写有要链接哪个库,比如你这里用的sqrt,
mansqrt的前几行如下:
SQRT(3)LinuxProgrammer'sManualSQRT(3)
NAME
sqrt,sqrtf,sqrtl-squarerootfunction
SYNOPSIS
#include
doublesqrt(doublex);
floatsqrtf(floatx);
longdoublesqrtl(longdoublex);
Linkwith-lm.
再比如:
manpthread_create
PTHREAD_CREATE(3)LinuxProgrammer'sManualPTHREAD_CREATE(3)
NAME
pthread_create-createanewthread
SYNOPSIS
#include
intpthread_create(pthread_t*thread,constpthread_attr_t*attr,
void*(*start_routine)(void*),void*arg);
Compileandlinkwith-pthread.
这里面都有写linkwithXXX了。
2、LD_LIBRARY_PATH环境变量是指定链接器可以在哪个目录查看动态库,而程序要连接哪个动态库是由-l参数指定的,链接器不会自动去找。

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

使用道具 举报

千问 | 2021-1-27 06:25:47 | 显示全部楼层
您回答的对我帮助很大,
但有的用man好像没啥用,我manstrcpy

它并未说linkwith...这时候怎么办?
第二条您说的LD_LIBRARY_PATH环境变量是指定链接器可以在哪个目录查看动态库,而程序要连接哪个动态库是由-l参数指定的
是不是就是说在/etc/profile或.bash_proflie中设置LD_LIBRARY_PATH环境变量都不能使程序自动连接函数库;
那您知道有什么方法可以有效地自动连接函数库。用到库函数多的时候总用-l连接不是很方便吧。
回复

使用道具 举报

千问 | 2021-1-27 06:25:47 | 显示全部楼层
PATH只是指明路径
在编译时只要加上-lm这样简写就行,
若没有配置LIB_PATH环境等,则编译时需要加全路径
另外除了最基本的库是不用连的以外,
用到别的库(.a/.so)函数都是要在编译时加上-lmor-L/lib64-lm等
编译一下他就会报哪些函数找不到了,加入相应的库就行了
可以看看makefile教程

回复

使用道具 举报

千问 | 2021-1-27 06:25:47 | 显示全部楼层
指定头文件,再makefile中用-I指定。
静态库和动态库方式一样,都是-L路径,-lxxx库
回复

使用道具 举报

千问 | 2021-1-27 06:25:47 | 显示全部楼层
引用3楼qq_25103581的回复:您回答的对我帮助很大,
但有的用man好像没啥用,我manstrcpy

它并未说linkwith...这时候怎么办?
第二条您说的LD_LIBRARY_PATH环境变量是指定链接器可以在哪个目录查看动态库,而程序要连接哪个动态库是由-l参数指定的
是不是就是说在/etc/profile或.bash_proflie中设置LD_LIBRARY_PATH环境变量都不能使程序自动连接函数库;
那您知道有什么方法可以有效地自动连接函数库。用到库函数多的时候总用-l连接不是很方便吧。

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

使用道具 举报

千问 | 2021-1-27 06:25:47 | 显示全部楼层
那是不在linux编写c和c++时不必过分担心链接库文件的问题,一部分不需要动态链接库,另一部分编译时需要链接库,用命令man即可解决
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行