我正在使用开发系统,我必须在访问其中的函数时指定lib名称。
之前我使用过open()之类的函数,并以某种方式发现它们位于libc.so中。
现在我想使用lstat(),但看起来这个不在libc中。遗憾的是,我查看的手册页没有记录功能的位置。
所以,有两个问题:
答案 0 :(得分:5)
在C中构建一个简单的测试用例,编译它并在其上运行'ldd -r'以检查加载了哪些库。如果你没有在C中获得lstat(),那么你的开发环境就会出现问题。或者这个env可以追溯到符号链接的年龄: - )
答案 1 :(得分:3)
这是一种方法:
tomislav@malik:~$ cd /usr/lib
tomislav@malik:/usr/lib$ grep "lstat()" *
Binary file libperl.so.5.10 matches
Binary file libperl.so.5.10.0 matches
tomislav@malik:/usr/lib$
答案 2 :(得分:1)
当我在Linux上交叉编译Windows应用程序时,如果我遇到链接问题,我倾向于使用这个名为mingw-findin的脚本。类似的脚本可以用于常规Linux编译,而不是使用mingw替代,使用常规nm而不是查看交叉编译前缀目录,查看/ usr / lib。要使用此脚本,我运行
./ mingw-findin NameOfFunction
以下是代码:
#!/bin/sh
liblist=` ls /usr/x86_64-w64-mingw32/lib `
for i in $liblist
do
if x86_64-w64-mingw32-nm /usr/x86_64-w64-mingw32/lib/$i | grep -q $1; then
echo $i
x86_64-w64-mingw32-nm /usr/x86_64-w64-mingw32/lib/$i | grep $1
fi
done
答案 3 :(得分:0)
试试这个:
$ cat ./foobar.c
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int main(void)
{
struct stat buf;
return lstat(".", &buf);
}
$ LD_DEBUG=bindings ./foobar 2>&1 | grep stat
31000: binding file ./foobar [0] to /lib/x86_64-linux-gnu/libc.so.6 [0]: \
normal symbol `__lxstat' [GLIBC_2.2.5]
答案 4 :(得分:-1)
从联机帮助页(man lstat):
LSTAT(P)
NAME
lstat - get symbolic link status
SYNOPSIS
#include <sys/stat.h>
int lstat(const char *restrict path, struct stat *restrict buf);
答案 5 :(得分:-1)
lstat
位于libc中,默认情况下会链接libc。除了包含lstat
的标题文件之外,您无需执行任何操作#include <sys/stat.h>
手册页通常会说明它们所在的库。