c - 当 C 需要特殊类型的 makefile 时,将 Fortran 90 与 C 混合使用?

标签 c makefile fortran mixing

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

If you want to embed the hypervolume function into your own C/C++ code, the main function for computing the hypervolume (fpli_hv) is self-contained in the file hv.c. A simple way to add it to your own code is to include Makefile.lib into your Makefile and link against fpli_hv.a. The exported function is:"

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)  

如何将此 C 例程嵌入到 FORTRAN 联编文件中?你能帮我吗,也许可以提供一个说明性的例子。我搜索了这个问题并找到了许多示例,但它们都显示了不需要操作 makefile 的简单示例。

最佳答案

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 的东西构建库在 hypervolume 源代码所在的目录中。

关于c - 当 C 需要特殊类型的 makefile 时,将 Fortran 90 与 C 混合使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10832322/

相关文章:

c - 为什么会出现段错误?

c - 使用 libvlc (ubuntu) 播放多轨文件/流

bash - Sed 给出 "sed: 1: "tsunit.js": undefined label 'sunit.js' "

java - JNI : "receipe for target ' HelloJNI. h' 在使用 'makefile' 时失败

compilation - gfortran 中的条件编译

c - 是什么导致了这个 memset() 中的段错误?

c - 了解符号扩展

c - 尝试使现有的 c 项目适应 CUDA,Makefile 找不到 .cu 文件

string - Fortran:从字符串中删除字符

arrays - Fortran 公共(public)变量、可分配数组