首页 > 解决方案 > 用于记录库要求的 C++/autoconf 等效于 requirements.txt 是什么?

问题描述

我有一个使用我已经维护了 15 年的 autoconf 的 C++ 库。我现在让它与 CI 一起运行,并发现我需要更好地记录它的要求。使用 python 程序,我requirements.txt使用 setuptools 在打包过程中使用的文件来执行此操作,我也可以在 CI 系统中使用。在 C++ autotools 包中记录这个的正确方法是什么?

标签: c++autotools

解决方案


这是技术作家想知道的一种问题:我们的产品有哪些包或依赖项。

C/C++ 中有两种依赖关系,而不是单一的 Python 依赖关系列表(我不是在谈论在某些 Python 包中找到的特定于测试的依赖关系或那种类型)。

有:

  • 标头包含依赖项
  • 库依赖

标头包含依赖项

有一个 C/C++ 编译器选项列出了所有非系统包含文件:

gcc -c -MMD  <source.c>

对于所有包含文件:

gcc -c -MD <source.c>

通过这些包含文件列表,您可以找到提供它的软件包,例如在 Debian 中:

dpkg-query -S <include-file.h>

库依赖

保护用于特定平台/发行版的完整库列表的最佳方法是使用ldd提取程序在启动和运行之前需要的外部对象代码列表。

#!/bin/bash

# List Debian packages that a given executable is dependent on
BINARY_FILE=$1

LIB_LIST=$(ldd $1 | gawk '{ print $1 }' | tr '\n' ' ')

for THIS_LIB in $LIB_LIST; do
  dpkg-query -S $THIS_LIB
done

的输出结果为您提供可执行文件所依赖/bin/ls的包的多平台列表:ls

~/bin/dpkg-dependency-by-executable.sh /bin/ls
dpkg-query: no path found matching pattern *linux-vdso.so.1*
libselinux1:amd64: /lib/x86_64-linux-gnu/libselinux.so.1
libc6-x32: /libx32/libc.so.6
libc6:amd64: /lib/x86_64-linux-gnu/libc.so.6
libc6-i386: /lib32/libc.so.6
libpcre3:amd64: /lib/x86_64-linux-gnu/libpcre.so.3
libpcre3:amd64: /lib/x86_64-linux-gnu/libpcre.so.3.13.3
libc6-i386: /lib32/libdl.so.2
libc6-x32: /libx32/libdl.so.2
libc6:amd64: /lib/x86_64-linux-gnu/libdl.so.2
libc6:amd64: /lib64/ld-linux-x86-64.so.2
libc6-i386: /lib32/libpthread.so.0
libc6-x32: /libx32/libpthread.so.0
libc6:amd64: /lib/x86_64-linux-gnu/libpthread.so.0
root#

通过这些列表,您可以确定您autotools已经正确地为它们进行了依赖测试(并且通常没有与系统相关的测试)。


推荐阅读