Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.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
如何使用带有gprof的makefile来重新编译依赖项?_Makefile_Fortran_Profiling_Gprof - Fatal编程技术网

如何使用带有gprof的makefile来重新编译依赖项?

如何使用带有gprof的makefile来重新编译依赖项?,makefile,fortran,profiling,gprof,Makefile,Fortran,Profiling,Gprof,我有一个makefile,它编译并链接对象以创建一个可执行文件。为了进行概要分析,我需要在编译之前使用一个额外的标志-pg。这是我当前的makefile: # objects required OBJS = obj1.o obj2.o # flags FC = gfortran FLAGS = -O3 PROFILEFLAG = -pg # executable EXE = program.exe PROFEXE = program_prof.exe # suffixes .SUFFIXE

我有一个makefile,它编译并链接对象以创建一个可执行文件。为了进行概要分析,我需要在编译之前使用一个额外的标志-pg。这是我当前的makefile:

# objects required
OBJS = obj1.o obj2.o

# flags
FC = gfortran
FLAGS = -O3
PROFILEFLAG = -pg

# executable
EXE = program.exe
PROFEXE = program_prof.exe

# suffixes
.SUFFIXES: .o .f90

# rules
%.o: %.f90
    $(FC) $(FLAGS) -c $<

default: $(OBJS)
    $(FC) $(FLAGS) $(OBJS) -o $(EXE)

profile: $(OBJS) 
    $(FC) $(FLAGS) $(OBJS) -o $(PROFEXE) $(PROFILEFLAG)

clean: 
    rm *.o *.mod

它按预期工作,但很耗时。我的实际makefile在子文件夹中有多个依赖项,所有这些都需要编辑。理想情况下,我正在寻找一条规则,该规则应使用“-pg”标志重新编译单个对象。

您可以完全按照自己的意愿执行以下操作:

然而,这通常不是首选的方式。除非您真的很努力,在概要文件和非概要文件构建之间来回切换时总是进行完全清理,否则很容易混淆,有些对象使用概要文件进行编译,而有些对象不使用概要文件进行编译

如评论中所述,最好将它们构建到单独的目录中:

$(PDIR)/%.o : %.f90
        @mkdir -p $(@D)
        $(FC) $(FLAGS) -pg -c -o $@ $<

$(ODIR)/%.o : %.f90
        @mkdir -p $(@D)
        $(FC) $(FLAGS) -c -o $@ $<

default: $(addprefix $(ODIR)/,$(OBJS))
        $(FC) $(FLAGS) $^ -o $@

profile: $(addprefix $(PDIR)/,$(OBJS))
        $(FC) $(FLAGS) -pg $^ -o $@

您可以完全按照自己的意愿,使用:

然而,这通常不是首选的方式。除非您真的很努力,在概要文件和非概要文件构建之间来回切换时总是进行完全清理,否则很容易混淆,有些对象使用概要文件进行编译,而有些对象不使用概要文件进行编译

如评论中所述,最好将它们构建到单独的目录中:

$(PDIR)/%.o : %.f90
        @mkdir -p $(@D)
        $(FC) $(FLAGS) -pg -c -o $@ $<

$(ODIR)/%.o : %.f90
        @mkdir -p $(@D)
        $(FC) $(FLAGS) -c -o $@ $<

default: $(addprefix $(ODIR)/,$(OBJS))
        $(FC) $(FLAGS) $^ -o $@

profile: $(addprefix $(PDIR)/,$(OBJS))
        $(FC) $(FLAGS) -pg $^ -o $@

当我遇到这个问题时,我总是使用你的手动方法。其他任何东西对我来说都是有问题的-如何知道存在的.o文件是否是用-pg编译的?这就是树外构建省去了很多麻烦的地方:一个构建目录用于分析对象,一个用于生产等…@EricBackus这正是我面临的问题。一种解决方法是在评测时重新编译并链接所有内容,但我不知道如何做到这一点。@francescalus,打得好!我可能只是尝试使用一个单独的目录进行分析。@smog事实上,当我仔细观察时,我发现我过去所做的实际上是MadScientist给出的答案的一个变体,其中对象文件根据编译选项获得不同的名称或路径。我会选择这样的方式。当我遇到这个问题时,我总是使用你的手动方法。其他任何东西对我来说都是有问题的-如何知道存在的.o文件是否是用-pg编译的?这就是树外构建省去了很多麻烦的地方:一个构建目录用于分析对象,一个用于生产等…@EricBackus这正是我面临的问题。一种解决方法是在评测时重新编译并链接所有内容,但我不知道如何做到这一点。@francescalus,打得好!我可能只是尝试使用一个单独的目录进行分析。@smog事实上,当我仔细观察时,我发现我过去所做的实际上是MadScientist给出的答案的一个变体,其中对象文件根据编译选项获得不同的名称或路径。我喜欢那样的东西。
$(PDIR)/%.o : %.f90
        @mkdir -p $(@D)
        $(FC) $(FLAGS) -pg -c -o $@ $<

$(ODIR)/%.o : %.f90
        @mkdir -p $(@D)
        $(FC) $(FLAGS) -c -o $@ $<

default: $(addprefix $(ODIR)/,$(OBJS))
        $(FC) $(FLAGS) $^ -o $@

profile: $(addprefix $(PDIR)/,$(OBJS))
        $(FC) $(FLAGS) -pg $^ -o $@