Linux 如何使用gcc从对象文件生成所有可能的二进制文件

Linux 如何使用gcc从对象文件生成所有可能的二进制文件,linux,gcc,Linux,Gcc,有人知道如何使用gcc从对象文件生成所有可能的二进制文件吗?我知道您可以使用:“gcc-MM”为一些给定的源文件生成所有的.o文件 但是如何使用gcc从对象文件生成所有可能的二进制文件呢 在项目中 示例:我使用“gcc-MM”生成:a.o、b.o、c.o、d.o 如果有人试图生成由每个.o文件生成的二进制文件列表,如下所示: a: b.o c.o d.o b: a.o c.o d.o c: a.o b.o d.o d: a.o b.o b.o 我可以用Perl脚本来实现这一点,但我只是好奇是否

有人知道如何使用gcc从对象文件生成所有可能的二进制文件吗?我知道您可以使用:“gcc-MM”为一些给定的源文件生成所有的.o文件

但是如何使用gcc从对象文件生成所有可能的二进制文件呢 在项目中

示例:我使用“gcc-MM”生成:a.o、b.o、c.o、d.o 如果有人试图生成由每个.o文件生成的二进制文件列表,如下所示:

a: b.o c.o d.o
b: a.o c.o d.o
c: a.o b.o d.o
d: a.o b.o b.o
我可以用Perl脚本来实现这一点,但我只是好奇是否有办法用gcc来实现

谢谢

简短回答:“不,但是……”

gcc-MM
可以为您提供
foo.o:bar.h
,因为
foo.cc
包含以下指令:

#include "bar.h"
那很容易。但是
foo.cc
也可以包含声明:

int bar_f1(int);
gcc如何知道哪个对象文件包含此函数的二进制代码?或者,如果有两个对象文件包含具有此签名的函数,那么应该使用哪一个?不可能

…除非

长回答,“是的,如果……”

如果不给源文件转发其他源文件中的声明,也不给头文件声明未包含在相应源文件中的任何内容,并且给包含
int main(…)
的源文件一个固定名称,例如,
main.cc
,然后您可以获取
gcc-MM的输出:

bar.o: bar.h baz.h
foo.o: bar.h
main.o: foo.h zot.h
pan.o: pan.h
zot.o: zot.h
并无需太多麻烦(使用Perl或sed)将其转换为:

理论上,通过扫描对象文件并构建依赖关系树,您可以不受这些限制(*);这可能相当于扫描是否存在
int main(…)
,隔离这些文件并将它们与所有其他文件链接起来,或者只是列出它们,如果您只需要一个没有依赖项的可能可执行文件列表(我仍然不确定您到底想要什么)。这些事情仍然需要您编写一些脚本,我知道单凭gcc无法完成


(*)您仍然必须避免使用同一事物的两个定义。

我看不出如何将“生成所有.o文件”映射到
gcc-MM
实际执行的操作。您的意思是要生成文件还是文件名列表?当你说“所有可能的二进制文件”时,你是说只有可执行文件吗?或者图书馆,或者什么?(举个例子会很有帮助。)对不起,如果问题含糊不清,我用一个例子更新了它。我是gcc的新手,所以我把问题写得很糟糕。您的示例非常不清楚,但我会尝试回答。我的目标是在makefile中列出所有.o文件的同时,找到自动声明可执行文件的最小代码量(以防其他人怀疑)谢谢,我不知道在声明可执行文件时可以列出所有的.o文件。这让事情变得容易多了。我知道哪些文件有main()函数。我的目标是在列出所有.o文件的同时,获得最小数量的代码来自动声明可执行文件files@AriesOnTheCusp当前位置1)我为什么要这样做?2) 虽然你承认我的答案很有用,但你并没有高估我的答案。3) 我没有投反对票。1)我认为这个问题将来可能对其他人有帮助2)谢谢!
main: bar.o foo.o zot.o