C++ make查找fortran 77文件,但不查找fortran 90文件

C++ make查找fortran 77文件,但不查找fortran 90文件,c++,makefile,fortran,C++,Makefile,Fortran,我在使用make编译混合C++/fortran90代码时遇到问题。如果我改为使用fortran77代码作为子例程,则编译时没有问题 文件系统的结构: ~/src/working/: main.cpp Makefile ~/src/lib/: f77library.f f90library.f90 cpplibrary.cpp ~/src/headers/: cpplibrary.h 生成文件如下所示: VPATH = ../headers/:../lib/ F77

我在使用make编译混合C++/fortran90代码时遇到问题。如果我改为使用fortran77代码作为子例程,则编译时没有问题

文件系统的结构:

~/src/working/:
  main.cpp
  Makefile

~/src/lib/:
  f77library.f
  f90library.f90
  cpplibrary.cpp

~/src/headers/:
  cpplibrary.h
生成文件如下所示:

VPATH = ../headers/:../lib/

F77 = gfortran
FC = gfortran
CXX = g++

FCFLAGS = -I/home/user/src/headers/     #These may be redundant with VPATH
FFLAGS = -I/home/user/src/headers/
CXXFLAGS = -I/home/user/src/headers/

main77 = main.o f77library.o cpplibrary.o
main90 = main.o f90library.o cpplibrary.o


main77 : $(main77)
    $(CXX) -o main77 $(main77) -lgfortran

main90 : $(main90)
    $(CXX) -o main90 $(main90) -lgfortran

main77.o : main77.cpp cpplibrary.h
main90.o : main90.cpp cpplibrary.h
cpplibrary : cpplibrary.cpp cpplibrary.h
f77library : f77library.f
f90library : f90library.f90
每个fortran文件都包含完全相同的子例程,每个子例程都是独立的文件。如果我用手工编译,效果很好,例如

gfortran -c ../lib/f90library.f90
g++ -c ../lib/cpplibrary.cpp -I../headers/
g++ -c main90.cpp -I../headers/
g++ -o main90 main90.o f90library.o cpplibrary.o
当我使用makefile编译f77时:
makemain77
。但是,当我尝试
makemain90
时,我收到以下错误消息

g++ -o main90 main90.o f90library.o cpplibrary.o -lgfortran
g++: f90library.o: No such file or directory

简言之,f90和f77版本之间的所有内容都是相同的,应该没有编译错误。为什么不能
make
识别出lib目录中有一个.f90文件需要编译?

显然,make没有提供编译.f90文件的隐式规则。但是您仍然可以实现您想要的,例如,通过添加模式规则

%.o: %.f90
    $(FC) $(FFLAGS) -c $<
%.o:%.f90
$(FC)$(FFLAGS)-c$<

手工操作时列出四个命令,使用Make时只列出第四个命令;Make是否执行前三个?@Beta抱歉,是的,使编译的main.o和cpplibrary.o很好(应该包括该输出)在目标中缺少
。此外,如果希望能够编译f77和f90源代码,那么使用内置的
FC
FFLAGS
变量不太可能有帮助。