Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在Linux中使用makefile将源文件更新到不同的文件夹_C_Linux_Compilation_Makefile_Gnu - Fatal编程技术网

C 在Linux中使用makefile将源文件更新到不同的文件夹

C 在Linux中使用makefile将源文件更新到不同的文件夹,c,linux,compilation,makefile,gnu,C,Linux,Compilation,Makefile,Gnu,我有一个LinuxGNUC项目,它需要为两个不同的硬件设备构建输出,使用一个通用的C源代码库,但不同的makefile。目前,我在同一个文件夹中有两个makefile,每个设备一个,当我对代码进行更改时,我必须首先执行“makeclean”来创建第一个模型,然后执行“makeclean”来创建第二个模型。这是因为它们使用不同的编译器和处理器。即使代码文件没有更改,我也必须为其他设备重新编译它 我想做的是为第二个模型使用不同的文件夹,因此它存储*.d和*.o文件的单独副本。我不必“澄清”,只需重新

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

我想做的是为第二个模型使用不同的文件夹,因此它存储*.d和*.o文件的单独副本。我不必“澄清”,只需重新编译更改的源代码。我已经研究过makefile语法,作为Linux新手,我只能对这些东西的神秘本质刮目相看

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


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

您可以将源文件编译为不同目录中的目标文件(“folder”在Unix上并不合适)。您只需设置适当的
制定
规则即可。您可以使用其他构建器,如,
scons

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

$(OBJDIR)/%.o: $(SRCDIR)/%.c
         $(COMPILE.c) -c $^ -o $@
您可以设置(在
Makefile
的前面)变量,例如

OBJDIR:=obj-$(shell uname -m)
还是更好的


我确实建议阅读GNU make的;它介绍了makefiles。

您希望在编译时将生成的文件(对象和依赖项)放入每个生成类型的单独文件夹中。以下是我为您所做的工作:

$(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\u OBJDIR)/%.o$(PRODUCT1\u OBJDIR)/%.d:%.cpp
@mkdir-p$(@D)
$(CXX)$(PRODUCT1\u DEPSFLAGS)$(CXXFLAGS)$(INCLUDE\u DIR)$<-o$(PRODUCT1\u OBJDIR)/$*.o
$(PRODUCT2_OBJDIR)/%.o$(PRODUCT2_OBJDIR)/%.d:%.cpp
@mkdir-p$(@D)
$(CXX)$(PRODUCT2\u DEPSFLAGS)$(CXXFLAGS)$(INCLUDE\u DIR)$<-o$(PRODUCT2\u OBJDIR)/$*.o
$PRODUCT1_OBJDIR和$PRODUCT2_OBJDIR是用于存储生成文件的目录的变量名称。这将检查对依赖项的更改,并在需要时重新编译


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

这可以通过的存储库机制轻松实现。如果您调用
makepp-R../src ARCH=which
,那么它将象征性地链接当前目录下
。/src
的所有部分,并在此处编译

您甚至可以创建一个文件
.makepprc
,并输入特定于此体系结构的任何选项,这样您就永远不会混淆在何处调用哪个命令

如果您的不同体系结构具有相同的生成文件(如生成的源文件),您甚至可以在
。/src
中构建,而另一个体系结构将获取不依赖于当前编译选项的所有内容


还有很多事情要做。除了做GNU make所能做的几乎所有事情外,还有很多更有用的事情,你甚至可以通过一些Perl编程来扩展你的Makefile。

展示你尝试过的
Makefile
-s的相关规则。如果你向我们展示你的目录结构和makefiles,那真的会很有帮助。否则,我们所能做的最好的事情就是提供您可能会发现难以实现的高级建议。我决定,如果我只创建一个简单的makefile(目前称为“test”),将源文件从model1目录更新到model2目录,会更容易。这就是我所拥有的。它从'model2'目录运行。*。c:../model1/*.c cp$<$@我正在用“make-f test-n”测试它,所以它实际上什么都不做,只需显示结果即可。它只显示第一个更改的文件,而不是所有更改的文件。(注意:两个空格不能用作换行符。)*.c:../model1/*.c cp$<$@不能工作。这应该是什么样子?在make rules中使用
%
,而不是
*
好的。我将其更改为:%.c:../model1/%.ccp$<$@当我输入“make-f test-n”时,它会回答“make:**no targets.Stop”。我缺少什么?如何在注释中获得a?两个空格不起作用!我决定,如果我只创建一个简单的makefile(目前称为“test”),将源文件从model1目录更新到model2目录,会更容易。model2目录有自己的makefile,专门用于构建此模型。这就是我所拥有的。它从'model2'目录运行。%。c:../model1/%.ccp$<$@我正在用“make-f test-n”测试它,所以它实际上什么都不做,只需显示结果即可。它回答“make:**no targets.Stop”。我已经审阅了GNU Make文档,没有得到它。(注意:两个空格不能用作换行符。)主持人:可以删除此线程吗?我最初的问题可能太模糊了,我从来没有得到我想要的答案。