我在使用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 $<
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句