【问题标题】:Compile petsc included code using a makefile, failed for '.f90' but passed for '.F90'使用 makefile 编译 petsc 包含的代码,“.f90”失败,但“.F90”通过
【发布时间】:2020-08-17 04:21:59
【问题描述】:

我在 Linux 虚拟机上使用 petsc (3.13.1)。 编译器是用gfortran编译的mpich-3.2.1。

在浏览教程时,我发现扩展程序是 .F90, 在我将分机更改为.f90 后文件无法正常工作。

我在 makefile 中为.f90 添加了一些规则,但还是不行。

我想知道如何修改 .f90 扩展的 makefile。

测试代码:

program test

#include <petsc/finclude/petscsys.h>
use petscsys

type(PetscInt) :: ierr
call PetscInitialize(PETSC_NULL_CHARACTER,ierr)
if (ierr .ne. 0) then
    write(*,*) 'Unable to initialize PETSc'
    stop
end if
call PetscFinalize(ierr)

end program test

另存为test_f90.f90test_F90.F90

test_f90.f90 不起作用

[cfd@localhost tutorial]$ make test_f90
mpif90 -fPIC -Wall -ffree-line-length-0 -Wno-unused-dummy-argument -g -O -I/home/cfd/petsc-3.13.1/linux-gnu/include -I/home/cfd/petsc-3.13.1/include   -L/home/cfd/petsc-3.13.1/linux-gnu/lib    -Wl,-rpath,/home/cfd/petsc-3.13.1/linux-gnu/lib  -o test_f90 test_f90.f90 -lpetsc   -lm
Warning: test_f90.f90:3: Illegal preprocessor directive
test_f90.f90:6.14:

type(PetscInt) :: ierr
              1
Error: Derived type 'petscint' at (1) is being used before it is defined
make: *** [test_f90] Error 1

当 test_F90.F90 通过时

[cfd@localhost tutorial]$ make test_F90
mpif90 -fPIC -Wall -ffree-line-length-0 -Wno-unused-dummy-argument -g -O -I/home/cfd/petsc-3.13.1/linux-gnu/include -I/home/cfd/petsc-3.13.1/include   -L/home/cfd/petsc-3.13.1/linux-gnu/lib    -Wl,-rpath,/home/cfd/petsc-3.13.1/linux-gnu/lib  -o test_F90 test_F90.F90 -lpetsc   -lm

makefile 修改自$PETSC_DIR/share/petsc/Makerfile.user

添加以下规则的地方

% : %.f90
    $(LINK.F) -o $@ $^ $(LDLIBS)
%.o: %.f90
    $(COMPILE.F) $(OUTPUT_OPTION) $<

完整的生成文件:

# -*- mode: makefile -*-

PETSc.pc := $(PETSC_DIR)/$(PETSC_ARCH)/lib/pkgconfig/PETSc.pc
PACKAGES := $(PETSc.pc)

CC := $(shell pkg-config --variable=ccompiler $(PACKAGES))
CXX := $(shell pkg-config --variable=cxxcompiler $(PACKAGES))
FC := $(shell pkg-config --variable=fcompiler $(PACKAGES))
CFLAGS_OTHER := $(shell pkg-config --cflags-only-other $(PACKAGES))
CFLAGS := $(shell pkg-config --variable=cflags_extra $(PACKAGES)) $(CFLAGS_OTHER)
CXXFLAGS := $(shell pkg-config --variable=cxxflags_extra $(PACKAGES)) $(CFLAGS_OTHER)
FFLAGS := $(shell pkg-config --variable=fflags_extra $(PACKAGES))
CPPFLAGS := $(shell pkg-config --cflags-only-I $(PACKAGES))
LDFLAGS := $(shell pkg-config --libs-only-L --libs-only-other $(PACKAGES))
LDFLAGS += $(patsubst -L%, $(shell pkg-config --variable=ldflag_rpath $(PACKAGES))%, $(shell pkg-config --libs-only-L $(PACKAGES)))
LDLIBS := $(shell pkg-config --libs-only-l $(PACKAGES)) -lm

print:
    @echo CC=$(CC)
    @echo CXX=$(CXX)
    @echo FC=$(FC)
    @echo CFLAGS=$(CFLAGS)
    @echo CXXFLAGS=$(CXXFLAGS)
    @echo FFLAGS=$(FFLAGS)
    @echo CPPFLAGS=$(CPPFLAGS)
    @echo LDFLAGS=$(LDFLAGS)
    @echo LDLIBS=$(LDLIBS)

% : %.f90
    $(LINK.F) -o $@ $^ $(LDLIBS)
%.o: %.f90
    $(COMPILE.F) $(OUTPUT_OPTION) $<
% : %.F90
    $(LINK.F) -o $@ $^ $(LDLIBS)
%.o: %.F90
    $(COMPILE.F) $(OUTPUT_OPTION) $<
% : %.c
    $(LINK.c) -o $@ $^ $(LDLIBS)
%.o: %.c
    $(COMPILE.cc) $(OUTPUT_OPTION) $<
% : %.cxx
    $(LINK.cc) -o $@ $^ $(LDLIBS)
%.o: %.cxx
    $(COMPILE.cc) $(OUTPUT_OPTION) $<

【问题讨论】:

  • 我怀疑,虽然这只是一个有根据的猜测,但后缀 .F90 使用预处理器,而后缀 .f90 没有,并且这种行为是编译器的一个特性,而不是在 makefile 中显式。
  • 标记是正确的。您通过重命名文件破坏了构建。 gfortran 文档根据文件扩展名描述其行为。

标签: makefile fortran gnu-make gfortran petsc


【解决方案1】:

感谢 Mark 和 evets。 我通过将-cpp 标志添加到FFLAGS 来修复它 在检查了预处理部分之后 手册https://linux.die.net/man/1/gfortran

makefile修改部分:

FFLAGS += -cpp
% : %.f90
    $(LINK.F) -o $@ $^ $(LDLIBS)
%.o: %.f90
    $(COMPILE.F) $(FFLAGS) $(OUTPUT_OPTION) $<

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多