假设一个复杂的项目(在C/C++中),是否有一种解决方案可以知道哪些源文件负责/使用哪些源文件来创建特定的二进制文件,而无需编译项目本身。
我知道我可以读取Makefile并尝试像这样遵循依赖链,但是它不是很可伸缩,如果使用多个Makefile和/或隐式规则,可能会很困难。
非常感谢你的帮助
PS:为了澄清第一个注释,我正在寻找一种方法,它不需要有一个有效的构建环境(例如,编译,即使是一个尝试运行,也不是一个选项)。
发布于 2021-01-21 12:55:54
是否有一种解决方案可以知道哪些源文件负责/用于创建特定的二进制文件,而无需编译项目本身
如果您使用GCC (或者可能是嘎吱声)编译,您可以使用适当的预处理选项 (如-M )生成并保存一些文本文件中的依赖项,格式为GNU制造或忍者构建自动化工具可以接受的格式。这在像Debian这样的Linux发行版上运行得很好。
您还可能对其他构建程序感兴趣,包括奥麦克,以及包管理器(如欧帕姆、urpmi等).
您也可以与SoftwareHeritage团队联系。
如果使用GCC,则可以编写自己的GCC插件来维护数据库中的这些依赖关系。
最后,注意赖斯定理,并考虑一些疯狂的例子(在C++中),如
#if __TIME__[0]=='1'
int something=0;
#else
constexpr int something=1;
#endif所以我现在的直觉是你的愿望是不可能的。我可能会误解它。
请参考一些C标准(如n1570 )或一些C++标准(如n3337 )。
研究像GNU autoconf这样的工具的行为。
想一想生成C或C++代码的程序,比如野牛,Mymanydl.c,双峰,大口,RefPerSys,反 .注意,GCC有许多C++代码生成器(特别是庚型),而且肯定是“一个用C++编码的复杂项目”。
另见从无到有。
https://stackoverflow.com/questions/65825929
复制相似问题