2011-04-19 236 views
2

抽象问题: 我正在编程一个高度模块化的中型C++/C程序。它有一个通用的接口,它允许你使用相同的函数声明放入许多不同的源,但是可以使用不同的实现并获得具有不同功能的可执行文件。有没有办法在Makefile中自动生成依赖关系树?

我正在制定一个可以处理建筑责任的制作系统。目前它能够根据配置文件的内容(用于make过程)获取专门的源代码,并将它们转储到具有适当通用名称的临时文件夹中。现在,我只需编译该项目。

问题是我有可变数量的源,并且源所依赖的头可以随个别实现而改变。换句话说,一个静态的makefile不会做到这一点。

'1.' 单独使用Makefile系统,有没有办法自动生成Main.cpp需要编译的对象(.o)文件列表?

我知道我可以通过编写一个我的makefile调用的小python脚本来做到这一点,随后通过解析检查它们的依赖关系的c文件来创建一个自定义makefile,从基础Main.cpp文件开始。

但我不想转向这个黑客解决方案,如果有更标准化的解决方案或某种方式来做这件事。

'2.'
如果makefile系统不能这样做,我应该继续使用自定义的python脚本,还是有更优雅的解决方案?

...............

要非常清楚,我再没有依赖性/资源/头/对象的名单不断,我不想迫使我的最终用户维护这样的清单。

我需要基于我的C文件的内容自动生成此树的某种方式。

如果这是一个“愚蠢”的问题,我很抱歉,我对制作世界比较陌生 - 并且像大多数人一样自学成才。

谢谢!

随时问任何问题。尽管如此,我的项目有太多的资料来源,只是将它们全部发布出来,而我因专有/研究原因无法这么做。

+0

是否有一些不错的shell命令可用于查找源代码? – alternative 2011-04-19 23:13:36

+0

要生成对象列表,是否足以扫描临时文件夹?也就是说,临时文件夹是否包含所有必须编译的源文件,而不是其他文件(现在不要在意头文件)。 – Beta 2011-04-19 23:59:52

回答

1

看一看here(高级自动依存产生)

+0

这是一个* okay *方法,但是当源依赖性发生变化时,它通常需要*两个*构建,否则这种形式的“自动依赖性”生成将不会受益。 – Barry 2015-12-02 05:01:54

0

是的,如果你使用的GCC!这里是我在当前项目中使用的一些Makefile(对于所有实际的用途,我将它放在公共领域,玩得开心)。

CC=$(CROSS)gcc -c -g -Wall -Werror -ansi -pedantic $(DEFINES) -I./include 

%.o: %.c .d/%.d 
    # Your build code here 

.d/%.d: %.c 
    @$(CC) -MM $< -MF [email protected] 

-include $(OBJECTS:%.o=.d/%.d) 
-include $(LOBJECTS:%.o=.d/%.d) 

如果我错过了一些东西,让我知道,我会再次检查我的Makefile。

请注意$(OBJECTS)是我想要在我的二进制文件中的对象列表,$(LOBJECTS)是正在编译为静态存档的对象列表。 $(OBJECTS)和$(LIB)(由$(LOBJECTS)创建)然后被编译为最终的可执行文件。因此,整个事情跨不同类型的对象的多个版本工作,然后链接等。

哦,是的,请确保你mkdir .d否则它可能会失败。您需要在空的.d目录中检入您的版本控制。

这里唯一需要注意的是你必须列出来源。但是,如果你想要,你可以设置一些小工具来使用find来找到你所有的资源。最后,通过使用多个目标(%.o .d/%d),这可能会被整理成更高效和更具可读性。我得看看那个。谢谢你提醒我。

-3

简化构建的一种方法是跳过依赖关系。每次重新编译一切。只有构建必须多次完成,或者需要“很长时间”,其定义取决于使用情况,依赖关系会发生很大变化,请务必执行详细的依赖关系构建。

+0

不,这不是一个好的答案,绝对是荒谬的。需要1分钟来设置依赖关系!为什么每次都浪费时间重新编译一切? – alternative 2011-04-19 23:04:11

+0

@mathepic:在我最近的大部分项目中,编译所有内容的时间为1到5秒。这真的值得维护吗? – wallyk 2011-04-19 23:26:07

+0

@wallyk如果你必须编译超过12次,因为它只需要一分钟设置(通常你会这样做),那么是的。 – alternative 2011-04-20 00:33:28

相关问题