c++ - 用于记录库要求的 C++/autoconf 等效于 requirements.txt 是什么?
问题描述
我有一个使用我已经维护了 15 年的 autoconf 的 C++ 库。我现在让它与 CI 一起运行,并发现我需要更好地记录它的要求。使用 python 程序,我requirements.txt
使用 setuptools 在打包过程中使用的文件来执行此操作,我也可以在 CI 系统中使用。在 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
已经正确地为它们进行了依赖测试(并且通常没有与系统相关的测试)。
推荐阅读
- r - 如何在R中重新缩放栅格图层?
- python - 如何检查列表中的任何进程是否正在运行?
- react-native - 当我从反应原生的一个选项卡导航到另一个页面时,如何从顶部删除选项卡栏
- java - 如何在数组索引处打印字符串数组?
- swift - 将我的结构放在哪里以保持班级独立?
- jquery - DatePicker 不是 Jquery 中的函数
- javascript - 在nodejs中的循环内等待承诺
- java - Android cardview 将特定卡片放在列表末尾
- python - 如何使用 pytables 或 h5py 将数据集对象复制到不同的 hdf5 文件?
- django - 在一个操作系统中创建的 Django 中的虚拟环境是否可以在另一个操作系统中工作?