【问题标题】:Updating source files to different folder using makefile in Linux在 Linux 中使用 makefile 将源文件更新到不同的文件夹
【发布时间】:2012-10-11 17:36:54
【问题描述】:

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

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

我正在考虑的一种方法是将 .c 和 .h 文件从 model_1 文件夹更新到 model_2 文件夹。谁能给我一个简单的 makefile,它只会将较新的 *.c 和 *.h 文件从一个文件夹复制到另一个文件夹?

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

【问题讨论】:

  • 显示你尝试过的Makefile-s的相关规则。
  • 如果您向我们展示您的目录结构和生成文件,这真的会有所帮助。否则,我们能做的最好的就是提供您可能难以实施的高级建议。

标签: c linux compilation makefile gnu


【解决方案1】:

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

$(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 是您希望存储生成文件的目录的变量名称。这将检查依赖项的更改并在需要时重新编译。

如果您仍有问题,请回复反馈,我们会尝试解决您的问题。

【讨论】:

  • 我决定如果我只创建一个简单的makefile(暂时称为'test')将源文件从model1目录更新到model2目录会更容易。 model2 目录有自己的生成文件,专门用于构建此模型。这就是我所拥有的。它从“model2”目录运行。 %.c: ../model1/%.ccp $ 我正在使用 'make -f test -n' 对其进行测试,所以它实际上并没有做任何事情,只是显示我的结果。它回复“make:***没有目标。停止”。我已经查看了 GNU Make 文档,但没有得到它。 (注意:两个空格不能用作换行符。)
  • 版主:这个帖子可以去掉吗?我最初的问题可能太模糊了,我一直没有得到我想要的答案。
【解决方案2】:

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

您可以使用remake 来调试您的GNU Makefile-s。你可以有一个像

这样的规则
$(OBJDIR)/%.o: $(SRCDIR)/%.c
         $(COMPILE.c) -c $^ -o $@

你可以设置(在你的 Makefile 之前的)变量,例如

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

或者更好的东西

我确实建议阅读 GNU make 的 manual;它有对 makefile 的介绍。

【讨论】:

  • 我决定如果我只创建一个简单的makefile(暂时称为'test')将源文件从model1目录更新到model2目录会更容易。这就是我所拥有的。它从“model2”目录运行。 *.c: ../model1/*.c cp $
  • *.c: ../model1/*.c cp $
  • make 规则中使用 %,而不是 *
  • 好吧我改成:%.c:../model1/%.ccp $
  • 如何在评论中获得 ?两个空格什么都不做!
【解决方案3】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多