作为我last one的后续问题,是否有任何简单的方法可以判断给定的C库是否安装在给定的机器上(不是以编程方式,只是一次性的事情)?我需要使用libuuid,但我不确定它是否安装在有问题的机器上。我能想到的唯一两种方式是:
1)尝试在那里编译代码(比我想做的工作多)
2)尝试类似“man libuuid”之类的东西,虽然如果由于某种原因导致联机帮助没有安装,这似乎并不总是可靠的。
还有其他更好的方法吗?
答案 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会在库中查找特定的符号/函数名称。