确定是否在Unix上安装了C库

时间:2009-09-03 21:58:54

标签: c unix

作为我last one的后续问题,是否有任何简单的方法可以判断给定的C库是否安装在给定的机器上(不是以编程方式,只是一次性的事情)?我需要使用libuuid,但我不确定它是否安装在有问题的机器上。我能想到的唯一两种方式是:

1)尝试在那里编译代码(比我想做的工作多)

2)尝试类似“man libuuid”之类的东西,虽然如果由于某种原因导致联机帮助没有安装,这似乎并不总是可靠的。

还有其他更好的方法吗?

4 个答案:

答案 0 :(得分:9)

您是否考虑过使用autoconf?它旨在检查并查看构建环境是否设置正确。

答案 1 :(得分:7)

最简单的方法是使用ld选项调用-l。这将有效地测试库的存在,自动搜索标准库位置:

$ ld -luuid
ld: warning: cannot find entry symbol _start; not setting start address
$ echo $?
0

$ ld -luuidblah
ld: cannot find -luuidblah
$ echo $?
1

# so...
$ ld -luuid 2>/dev/null && echo "libuuid exists" || echo "libuuid not found"

修改

正如dreamlax所指出的,这并不适用于所有unix变体。我不知道它是否适用于所有unix(我已经测试过linux和OpenBSD),但你可以试试这个:

$ echo "int main(){}" | gcc -o /dev/null -x c - -luuid 2>/dev/null
$ echo $?
0

$ echo "int main(){}" | gcc -o /dev/null -x c - -luuidblah 2>/dev/null
$ echo $?
1

答案 2 :(得分:2)

以下是我使用autoconf所做的事情,我在这里展示的是下一个可能来的其他人的实例:

我创建了包含以下内容的文件configure.ac

AC_INIT(package, 1.1, email)
AC_CHECK_LIB(uuid, uuid_generate_random, [echo "libuuid exists"], [echo "libuuid missing"])

然后我按顺序运行了以下命令(我创建configure.ac的同一个文件夹):

autoconf
./configure

在配置结束时,它会回显它是否在uuid_generate_random库中找到了uuid。似乎工作得很好(虽然不幸的是,有两个操作系统错过了库,但这是另一个问题)。

对于任何可能在事后找到这个的人,这里的AC_INIT参数都是扔掉的,你可以批量复制它们。 AC_CHECK_LIB的参数是:库名,该库中函数的名称,成功时的操作,失败时的操作。

尽管Mehrdad的答案并不像我希望的那样有用(即没有花时间去训练文档)但它似乎是正确的,我会接受它。 mhawke:我真的很喜欢你的答案,但我不太确定如何测试以确保它有效。它似乎在SunOS上,但在另外两个(AIX,HPUX)上总是说不,我似乎无法想出一个我能保证它会找到的库。

感谢帮助人员。

答案 3 :(得分:0)

如上所述,autotools检查库中的符号。它的方式有点简单。正如你在1)中所提到的,autoconf及其结果是configure脚本,它基本上创建了一个虚拟c程序并试图链接到有问题的库。如果它工作,图书馆工作,如果它失败,显然它不会工作。 Autoconf会在库中查找特定的符号/函数名称。