用于记录库要求的C ++ / autoconf等同于requirements.txt?

时间:2020-06-28 17:01:45

标签: c++ autotools

我有一个使用autoconf的C ++库,该库已经维护了15年。我现在将其与CI一起运行,并且发现我需要做得更好,以记录其要求。使用python程序,我使用名为requirements.txt的文件来执行此操作,该文件在打包过程中由setuptools使用,并且我也可以在CI系统中使用。在C ++自动工具包中对此进行记录的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

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

在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已经对它们进行了相关性测试(通常没有与系统相关的测试)。