【问题标题】:Mixing Fortran 90 with C, when C requires a special type of makefile?当 C 需要特殊类型的 makefile 时,将 Fortran 90 与 C 混合?
【发布时间】:2012-05-31 11:02:10
【问题描述】:

我有一个 FORTRAN 代码,它需要一个 C 例程来计算度量。 C 例程包括 .c 和 .h 文件,并在其编写的文档中:

如果你想将超卷函数嵌入到你自己的 C/C++ 代码中,计算超卷的主要函数 (fpli_hv) 包含在文件 hv.c 中。将它添加到您自己的代码中的一种简单方法是将 Makefile.lib 包含到您的 Makefile 中并链接到 fpli_hv.a。导出的函数是:"

double fpli_hv(double *front, int d, int n, double *ref); 

makefile.lib 也如下:

VARIANT    ?= 4

HV_SRCS    = hv.c
HV_HDRS    = hv.h
HV_OBJS    = $(HV_SRCS:.c=.o)
HV_LIB     = fpli_hv.a

$(HV_LIB): $(HV_OBJS)
    @$(RM) $@
    $(QUIET_AR)$(AR) rcs $@ $^

## Augment CFLAGS for hv.[co] objects
hv.o: CPPFLAGS += -D VARIANT=$(VARIANT)

## Dependencies:
$(HV_OBJS): $(HV_HDRS)  

如何在 FORTRAN makefile 中嵌入这个 C 例程?您能否帮助我,也许可以提供一个说明性的例子。我搜索了这个问题并找到了一些示例,但它们都显示了不需要操作 makefile 的简单示例。

【问题讨论】:

    标签: c makefile fortran mixing


    【解决方案1】:

    Makefile.lib 包含到另一个Makefile 中应该添加一个名为fpli_hv.a 的新目标(也将定义HV_LIB 宏)。您应该将其作为依赖项添加到用于构建 Fortran 代码的 makefile 中的目标之一。例如:

    Makefile,用于构建Fortran代码

    ...
    
    myprog.exe: <list of object files>
        $(FC) -o $@ $^
    
    ...
    

    修改应该很简单:

    ...
    
    include Makefile.lib
    
    ...
    
    myprog.exe: <list of object files> $(HV_LIB)
        $(FC) -o $@ $^ $(HV_LIB)
    
    ...
    

    或者,如果您不打算经常更改和重新编译 C 代码,那么您可以简单地构建库,然后将类似这样的内容添加到您的 Fortran Makefile:

    ...
    
    LIBHV = /path/to/fpli_hv.a
    
    ...
    
    myprog.exe: <list of object files>
        $(FC) -o $@ $^ $(LIBHV)
    

    可能原始的超卷Makefile 已经包含Makefile.lib,因此您应该能够在超卷源代码所在的目录中通过make fpli_hv.a 之类的东西来构建库。

    【讨论】:

    • 非常感谢您的帮助。现在,我知道如何处理 makefile。是的,你是对的,原始的 makefile 包含 makefile.lib,所以一切都会好起来的。我的另一个问题是如何在 fortran 中调用 C 函数 (double fpli_hv(double *front, int d, int n, double *ref);)。我需要定义接口吗?这样的界面会是什么样子?谢谢,马特
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    • 2021-12-31
    相关资源
    最近更新 更多