0

我有一个 Linux GNU C 项目,它需要为两个不同的硬件设备构建输出,使用一个通用的 C 源代码库,但使用不同的 makefile。目前我在同一个文件夹中有两个makefile,每个设备一个,当我对代码进行更改时,我必须先“make clean”来制作第一个模型,然后“make clean”来制作第二个模型. 这是因为它们使用不同的编译器和处理器。即使代码文件没有更改,我也必须为其他设备重新编译它。

我想做的是为第二个模型使用不同的文件夹,因此它存储 *.d 和 *.o 文件的单独副本。我不必“清理”,只需重新编译更改的源。我看过 makefile 语法,并且是 Linux 的新手,只能对这些东西的神秘性质摸不着头脑。

我正在考虑的一种方法是将 .c 和 .h 文件从 model_1 文件夹更新到 model_2 文件夹。有人可以为我提供一个简单的生成文件,它只会将较新的 *.c 和 *.h 文件从一个文件夹复制到另一个文件夹吗?

或者,必须有一种方法可以拥有一个公共源文件夹和单独的输出文件夹,因此不需要重复的源文件。任何帮助实现这一目标表示赞赏。如果您想查看它们,我可以提供 makefile。

4

3 回答 3

0

这可以通过makepp的存储库机制轻松实现。如果你调用makepp -R../src ARCH=whatever那么它将符号链接../src当前目录下的所有部分并在这里编译。

您甚至可以创建一个文件.makepprc并放入特定于该架构的任何选项,因此您永远不会混淆在哪里调用哪个命令。

如果您的不同架构具有相同的生成文件(如生成的源文件),您甚至可以构建,../src而其他架构将选择不依赖于您当前编译选项的所有内容。

makepp 还有很多。除了做 GNU make 能做的几乎所有事情,还有很多有用的东西,你甚至可以用一些 Perl 编程来扩展你的 makefile。

于 2013-04-07T11:15:30.913 回答
0

您希望在编译时将生成的文件(对象和依赖项)放入每个构建类型的单独文件夹中。这是我所做的可能对你有用的事情:

$(PRODUCT1_OBJDIR)/%.o $(PRODUCT1_OBJDIR)/%.d: %.cpp
        @mkdir -p $(@D)
        $(CXX) $(PRODUCT1_DEPSFLAGS) $(CXXFLAGS) $(INCLUDE_DIR) $< -o $(PRODUCT1_OBJDIR)/$*.o

$(PRODUCT2_OBJDIR)/%.o $(PRODUCT2_OBJDIR)/%.d: %.cpp
        @mkdir -p $(@D)
        $(CXX) $(PRODUCT2_DEPSFLAGS) $(CXXFLAGS) $(INCLUDE_DIR) $< -o $(PRODUCT2_OBJDIR)/$*.o

$PRODUCT1_OBJDIR 和 $PRODUCT2_OBJDIR 是您希望存储生成文件的目录的变量名称。这将检查依赖项的更改并在需要时重新编译。

如果您仍然有问题,请回复反馈,将尝试解决您的问题。

于 2012-10-12T01:03:54.243 回答
0

您可以将源文件编译为不同目录中的目标文件(“文件夹”在 Unix 上并不是真正合适的词)。你只需要设置适当的make规则。您可能会使用其他构建器,例如omake , scons, ...

你可以使用remake来调试你的 GNU Makefile-s。你可以有这样的规则

$(OBJDIR)/%.o: $(SRCDIR)/%.c
         $(COMPILE.c) -c $^ -o $@

你可以设置(在你的早期Makefile)变量,例如

OBJDIR:=obj-$(shell uname -m)

或者更好的东西

我建议阅读 GNU make 的手册;它介绍了makefile。

于 2012-10-11T17:42:18.850 回答