C语言 编译映射



假设一个复杂的项目(在C/c++中),有没有一种解决方案可以在不编译项目本身的情况下知道哪些源文件负责/用于创建特定的二进制文件?

我知道我可以只是阅读Makefile并尝试遵循依赖链,但它不是很可扩展,如果使用多个makefile和/或隐式规则,它可能很难。

谢谢你的帮助

PS:为了澄清第一个评论,我正在寻找一种方法,其中需要有一个有效的构建环境(例如,编译,即使作为一个干运行,不是一个选项)。

是否有一种解决方案可以知道哪些源文件负责/用于创建特定的二进制文件而无需编译项目本身

如果您使用GCC(或者Clang)进行编译,您可以使用适当的预处理器选项,如-M,以GNU make或ninja构建自动化工具可接受的格式生成并保存在一些文本文件中。这在Debian等Linux发行版上运行良好。

您也可能对其他构建器感兴趣,包括ommake和包管理器,如opam, urpmi等…

您也可以与SoftwareHeritage团队联系。

如果你使用GCC,你可以编写自己的GCC插件来维护数据库中的这些依赖项。

最后,要注意Rice定理,并考虑一些疯狂的例子(在c++中),如

#if __TIME__[0]=='1'
int something=0;
#else
constexpr int something=1;
#endif

所以我目前的直觉是,你的愿望是不可能的。我可能误解了。

参考一些C标准,如n1570,或一些c++标准,如n3337。

学习像GNU autoconf这样的工具的行为。

考虑生成 C或c++代码的程序,如GNU bison, my manydl.c, bmon, SWIG, RefPerSys, ANTLR ....请注意,GCC有许多c++代码生成器(尤其是gengtype),并且肯定是一个用c++编码的复杂项目。

请参见linuxfromscratch。

最新更新