Dependencies 使用自动工具获取所需的标题和库

Dependencies 使用自动工具获取所需的标题和库,dependencies,package,dependency-management,autotools,autoconf,Dependencies,Package,Dependency Management,Autotools,Autoconf,configure.ac可以包含对标题和库的检查: AC_CHECK_LIB(cap,cap_compare,[cap_libs="-lcap"]) AC_CHECK_HEADERS([sys/acl.h linux/netlink.h]) 由于autotools支持仅获取这些文件的列表(即使未显示它们的默认位置,或至少显示这些文件的位置): 我试图找到/创建一个工具,它可以从autotools输入生成Linux发行版丢失的包 更新我发现我没有正确表达自己,并且用错误的陈述误导了你。我是的开发

configure.ac
可以包含对标题和库的检查:

AC_CHECK_LIB(cap,cap_compare,[cap_libs="-lcap"])
AC_CHECK_HEADERS([sys/acl.h linux/netlink.h])
由于autotools支持仅获取这些文件的列表(即使未显示它们的默认位置,或至少显示这些文件的位置):

我试图找到/创建一个工具,它可以从autotools输入生成Linux发行版丢失的包

更新我发现我没有正确表达自己,并且用错误的陈述误导了你。我是的开发者之一。我扩展了autotools宏,所以我对它的工作原理有了一些了解。由于该项目的目标是从源代码编译(发行版中不会有包),因此我想让编译它的用户能够轻松地为它提供所有主要Linux发行版的包依赖项列表

手动维护这些依赖关系可能是最简单的方法。但是因为我们有自动工具
AC\u CHECK\u LIB()
AC\u CHECK\u HEADERS()
宏形式的这些依赖项,所以我想使用它们。以某种方式输入自动工具(
configure.ac
和所有
m4/*.m4
)并生成标题和目录列表:

sys/acl.h
linux/netlink.h
...

libcap.so
...
这个列表对我会有很大帮助。这就是我想知道的。

当然,我可以手动创建这个列表,也可以使用正则表达式从autotools或源代码中解析它,但是从autotools中直接获取它会很好

如何处理这个列表的想法:我会有另一个带有预定义包含路径和默认库路径的脚本(
/usr/include/
将是大多数发行版的包含路径,例如Debian/Ubuntu的
/lib/x86_64-linux-gnu/
,或openSUSE的
/usr/lib64
),我会把它放在头和库前面。IMHO
pkg config
不是一个选项,因为它是
*。pc
config文件与依赖项一起安装的,因此当我搜索的包未安装时,它将不可用


然后,我会用这个列表搜索软件包,使用能够在线搜索的分发工具(即不依赖于安装的软件包,例如Debian/Ubuntu的apt file,
dnf
yum
zypper
)或在线搜索(,…),但这是另一个主题。

我在这里假设您不是
configure.ac
文件的所有者。 不幸的是,我认为这样的工具并不存在

根据William Pursell在中的回答,autotools不是一个包管理器,因此它对包本身一无所知,就像Linux发行版的包管理器一样

pkg config给autotools带来了一些包的概念,但是根据我之前链接的帖子,它给出的结果可能是错误的,特别是如果您考虑交叉编译的话

但是,您仍然可以使用configure.ac中的pkg config宏来尝试确定丢失了哪些包(由您的操作系统的包管理器知道)

关于
AC_CHECK_LIB
AC_CHECK_HEADERS
,我相信您将很难使用它们来生成丢失的头和库的绝对路径,原因如下:

  • 头文件和库文件位置的前缀取决于发行版(历史的
    /usr/lib
    与Ubuntu 16.04上更新的
    /usr/lib/x86_64-linux
    相比,前者的发行版为ex)
  • 发行版本身也是如此(
    /usr/lib
    vs
    /usr/local/lib
  • 一些操作系统软件包管理器不会给你一个包含在给定软件包中的文件列表,除非该软件包实际上已经安装在你的系统上(Ubuntu 16.04上的apt就是这种情况)
  • 包含给定库的软件包在不同的发行版上可能没有相同的名称(我记得在Ubuntu之后使用Fedora时出现了这个问题,我找不到我曾经使用过的任何软件包)
简言之,我认为这样的工具并不存在(但可能是错误的),编写这样的工具可能会揭示出相当复杂的问题,并且与某个特定的操作系统/发行版紧密相关

由于autotools支持仅获取这些文件的列表(即使未显示它们的默认位置,或至少显示这些文件的位置):

您似乎对Autoconf的工作原理有误解。它不知道头或库的具体位置,当然也没有默认位置的概念。相反,它使用以前发现的编译器和链接器以及在其标准变量中设置的任何标志来检查头文件和库的存在

编译器有,链接器也有。在执行检查的点处,可以通过
-I
-L
$cppfagas
$CFLAGS
中的其他标志(视情况而定)来增加这些标记。这些属性的组合决定了搜索任何特定标题或库的位置,但同样,不是直接由
configure
脚本本身来搜索的

我试图找到/创建一个工具,它可以从autotools输入生成Linux发行版丢失的包


当然,您可以解析Autoconf输入文件。事实上,由于它被设计为通过
m4
进行处理,您可以编写一组替换的
m4
宏和配置,提供调用的
AC\u CHECK\u头
AC\u CHECK\u LIB
等宏的详细信息。通过这种方式,您可以很好地了解构建包需要哪些库,但不知道在哪些特定目录中可以找到它们。

您好,我很难理解您的问题。你能以某种方式重新表述它,或者添加更多细节/例子吗?关于你的更新:我的答案已经解决了你修改后的问题。重述:
sys/acl.h
linux/netlink.h
...

libcap.so
...