Makefile 使用生成文件编译包含petsc的代码,失败原因为';。f90和x27;但被认为是';。F90和x27;

Makefile 使用生成文件编译包含petsc的代码,失败原因为';。f90和x27;但被认为是';。F90和x27;,makefile,fortran,gnu-make,gfortran,petsc,Makefile,Fortran,Gnu Make,Gfortran,Petsc,我正在Linux虚拟机上学习petsc(3.13.1)。 编译器是使用gfortran编译的mpich-3.2.1 在阅读教程时,我发现扩展名是.F90, 在我将ext更改为.f90后,这些文件不起作用 我在makefile中为.f90添加了一些规则,但仍然不起作用 我想知道如何修改.f90扩展名的makefile 测试代码: program test #include <petsc/finclude/petscsys.h> use petscsys type(PetscInt)

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

在阅读教程时,我发现扩展名是
.F90
, 在我将ext更改为
.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
当测试通过时_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\u DIR/share/PETSC/Makerfile.user

其中添加了以下规则

% : %.f90
    $(LINK.F) -o $@ $^ $(LDLIBS)
%.o: %.f90
    $(COMPILE.F) $(OUTPUT_OPTION) $<
%:%.f90
$(LINK.F)-o$@$^$(LDLIBS)
%.o:%.f90
$(COMPILE.F)$(输出选项)$<
完整的生成文件:

# -*- 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) $<
#-*-模式:makefile-*-
PETSc.pc:=$(PETSc_DIR)/$(PETSc_ARCH)/lib/pkgconfig/PETSc.pc
套餐:=$(PETSc.pc)
CC:=$(shell pkg config--variable=ccompiler$(包))
CXX:=$(外壳程序包配置--变量=cxxcompiler$(包))
FC:=$(外壳程序包配置--变量=fcompiler$(包))
CFLAGS_OTHER:=$(shell包配置--CFLAGS仅其他$(包))
CFLAGS:=$(shell pkg config--variable=CFLAGS\u额外$(包))$(CFLAGS\u其他)
CXXFLAGS:=$(外壳程序包配置--变量=CXXFLAGS\U额外$(包))$(CFLAGS\U其他)
FFLAGS:=$(shell pkg config--variable=FFLAGS_extra$(包))
CPPFLAGS:=$(shell包配置--cflags-only-I$(包))
LDFLAGS:=$(shell包配置--libs-only-L--libs-only其他$(包))
LDFLAGS+=$(patsubst-L%,$(shell pkg config--variable=ldflag_rpath$(PACKAGES))%,$(shell pkg config--libs-only-L$(PACKAGES)))
LDLIBS:=$(shell包配置--libs-only-l$(包))-lm
打印:
@echo CC=$(CC)
@echo CXX=$(CXX)
@echo FC=$(FC)
@echo CFLAGS=$(CFLAGS)
@echo CXXFLAGS=$(CXXFLAGS)
@回波FFLAGS=$(FFLAGS)
@echo CPPFLAGS=$(CPPFLAGS)
@echo LDFLAGS=$(LDFLAGS)
@回声LDLIBS=$(LDLIBS)
%:%f90
$(LINK.F)-o$@$^$(LDLIBS)
%.o:%.f90
$(COMPILE.F)$(输出选项)$<
%:%F90
$(LINK.F)-o$@$^$(LDLIBS)
%.o:%.F90
$(COMPILE.F)$(输出选项)$<
%:%c
$(LINK.c)-o$@$^$(LDLIBS)
%.o:%.c
$(COMPILE.cc)$(输出选项)$<
%:%.cxx
$(LINK.cc)-o$@$^$(LDLIBS)
%.o:%.cxx
$(COMPILE.cc)$(输出选项)$<
谢谢马克和埃夫斯。 我通过将
-cpp
标志添加到
FFLAGS
在检查了 手册

makefile修订部分:

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

虽然这只是一个有根据的猜测,但我怀疑后缀
.F90
会占用预处理器,而后缀
.F90
不会占用预处理器,而且这种行为是编译器的一项功能,在makefile中不显式。标记是正确的。您通过重命名文件破坏了生成。gfortran文档基于文件扩展名描述其行为。
FFLAGS += -cpp
% : %.f90
    $(LINK.F) -o $@ $^ $(LDLIBS)
%.o: %.f90
    $(COMPILE.F) $(FFLAGS) $(OUTPUT_OPTION) $<