有人可以帮助我理解为什么我的 find 命令不像 ls 命令那样报告 lib64 结果(注意这些命令在 Debian 上的 makefile 中调用)
LIBXML2 = $(shell find /usr/lib* -name libxml2.so.2.*)
LIBXML2_LS = $(shell ls -1 /usr/lib*/libxml2.so.2.*)
下面是输出
@echo LIBXML2: "$(LIBXML2)"
LIBXML2: /usr/lib/libxml2.so.2.7.8 /usr/lib32/libxml2.so.2.7.8
@echo LIBXML2_LS: "$(LIBXML2_LS)"
LIBXML2_LS: /usr/lib32/libxml2.so.2.7.8 /usr/lib64/libxml2.so.2.7.8 /usr/lib/libxml2.so.2.7.8
答案1
斯蒂芬·哈里斯 (Stephen Harris) 指出,/usr/lib64
可能是您系统上的符号链接。当您调用 时find /usr/lib64
,find
遍历/usr/lib64
,发现它不是一个目录(它是一个符号链接),因此不会进一步递归。
要find
查看/usr/lib64
它是否是目录的符号链接,请添加斜杠 - 在目录的符号链接名称末尾添加斜杠会使其被解释为目标目录而不是链接。
还要将模式放在-name
引号中,否则如果当前目录中恰好有匹配的文件,它将被扩展。
LIBXML2 = $(shell find /usr/lib*/ -name 'libxml2.so.2.*')
但请注意,这是一个坏主意。遍历所有内容/usr/lib
非常慢,并且可能会找到您不想链接的库的私有副本,或者具有相似名称的不相关文件(例如某些文档文件libxml.so.2.txt
)。
很少有理由以这种方式寻找图书馆。如果库位于标准系统位置(即您要查找的位置),则链接器将找到它,而无需您提供任何显式路径,只需使用-lxml2
.如果库位于不同的位置,则通常由脚本来configure
查找它。对于 libxml,定位部件的正确方法是pkg 配置:
CFLAGS += $$(pkg-config --cflags libxml-2.0)
LDFLAGS += $$(pkg-config --libs libxml-2.0)