有谁知道如何使用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
由于
答案 0 :(得分:1)
简短回答,"不,但......"
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)进入:
main: bar.o foo.o zot.o
理论上,你可以通过扫描目标文件和构建依赖树来实现没有这些限制(*);这可能等同于扫描int main(...)
的存在,隔离这些文件并将它们中的每一个链接到所有其他文件,或者只是列出它们,如果你想要的只是一个没有依赖项的可执行文件列表(我还不确定你想要什么?。这些东西仍然需要你自己编写脚本,我知道单独使用gcc无法做到这一点。
(*)您仍然必须避免对同一事物有两个定义。