c – 在我的用户定义的makefile中的makefile上使用PETSc

我是PETSc的新人.我有一个很大的C代码,我想将PETSc添加到我已经拥有的一些文件中,所以我必须以一种可以编译PETSc的方式更改我的makefile.

是否有可能有两个不同的makefile,然后在我自己的makefile中调用PETSc makefile?如果是的话,我怎么能这样做?

有没有人有任何将PETSc链接到他们自己的代码的经验?

顺便说一句,我使用Linux作为我的操作系统.

最佳答案
编辑:虽然这是一个老帖子,但我确信仍有人在努力解决这个问题.

此外,对于petsc 3.6.x(和slepc 3.6.x),事情显然略有改变.

我目前在我的ubuntu 14.04 LTS makefile中使用以下行来获取F90文件(使用petsc 3.6.1和slepc 3.6.0):

# PETSC and SLEPC directories
PETSC_DIR = /opt/petsc-3.6.1
SLEPC_DIR = /opt/slepc-3.6.0
include  $(PETSC_DIR)/lib/petsc/conf/variables
include  $(SLEPC_DIR)/lib/slepc/conf/slepc_variables

使用这个,我可以构建

# Compiler command
COMPILE = $(COMP_DIR) $(COMP_FLAGS) $(PETSC_FC_INCLUDES) $(SLEPC_INCLUDE)

其中COMP_DIR必须手动设置(例如COMP_DIR = /usr/bin/mpif90或COMP_DIR = /usr/bin/gfortran),COMP_FLAGS是附加标志(例如’-g O0′),以及

# Link command
LINK = $(LINK_DIR) &(LINK_FLAGS)

其中LINK_DIR必须手动设置(例如/usr/bin/g),LINK_FLAGS包含其他标志(例如-fPIC).

然后可以使用它们来创建编译F90文​​件的规则(我确信C非常相似):

%.o : %.f90
$(COMPILE) -c $<

和主程序:

main:   $(ObjectFiles) main.o
$(LINK) -o $@ $(ObjectFiles) main.o $(LINK_LIB) $(PETSC_LIB) $(SLEPC_LIB)

其中ObjectFiles包含项目中所有文件的列表,LINK_LIB对应于其他链接(例如-lgfortran).

这对我来说很好,但总是欢迎改进建议.

原帖:
而不是Divakar描述的hack,您可以通过运行轻松找到链接标志和包含目录以进行编译

make getlinklibs
make getincludedirs

在主要的petsc目录中,如here所述……

转载注明原文:c – 在我的用户定义的makefile中的makefile上使用PETSc - 代码日志