c++ - make 查找 fortran 77 文件但不查找 fortran 90 文件

标签 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 = 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 时:make main77 它编译正常。但是,当我尝试 make main90 时,我收到以下错误消息

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 $<

关于c++ - make 查找 fortran 77 文件但不查找 fortran 90 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25494211/

相关文章:

fortran - 如何在 Fortran 中创建函数?

c++ - <List of functions>的多重定义

c++ - 如何在不知道最初输入多少值的情况下将整数存储到数组

makefile - 制作 : Setting target-specific variables in static pattern rules

linux - -@在shell脚本之前,是什么意思

arrays - 屏蔽 Fortran 数组的更好方法?

compiler-errors - 错误: Unclassifiable statement at (1) using log() logarithm [duplicate]

c++ - 代码块中的奇怪逻辑

C++ c-tor 处理默认成员值构造异常?

c - GNU Make 构建过时且更新于特定时间戳的文件