makefile将fortran库链接到C程序

时间:2014-10-24 17:59:15

标签: c makefile linker fortran

我正在尝试构建一个makefile来编译一个C程序,然后将它链接到一个名为MUMPS的fortran库(它还需要blas和pthread库)。所以我的想法是通过gcc编译然后通过gfortran链接。这就是我得到的。

ROOT = $(addprefix $(PWD), /)
BUILDS_DIR = $(addprefix $(ROOT), builds/)
SRCS_DIR   = $(addprefix $(ROOT), src/)
INCS_DIR   = $(addprefix $(ROOT), src/)
OBJS_DIR   = $(addprefix $(SRCS_DIR), objects/)
LIBS_DIR   =

MUMPS_DIR      = $(MUMPS_ROOT)
MUMPS_INCS_DIR = $(addprefix $(MUMPS_DIR), /include)
MUMPS_LIB_DIR  = $(addprefix $(MUMPS_DIR), /lib)
MUMPS_MPI_DIR  = $(addprefix $(MUMPS_ROOT), /libseq)

CC       = gcc -c
CFLAGS   = -O3 -DTRILIBRARY
INCLUDES = -I$(INCS_DIR) -I$(MUMPS_INCS_DIR)

FL       = gfortran -o
LFLAGS   = -L$(LIBS_DIR) -L$(MUMPS_LIB_DIR) -L$(MUMPS_MPI_DIR)
CLIBS    = -lm
FLIBS    = -lblas
LDLIBS   = -lpthread

MUMPS_LIBS = -ldmumps -ldmumps_seq -lmumps_common -lmumps_common_seq -lpord -lpord_seq -lmpiseq

LIBS = $(CLIBS) $(FLIBS) $(LDFLIBS) $(MUMPS_LIBS)

虽然规则是

default: $(TARGET)

$(TARGET): $(OBJS)
    @echo -e "\n\n\t\t*** Compile successfully! ***\n" ;
    $(FL) $(BUILDS_DIR)$@ $(LFLAGS) $(LIBS) \
        $(OBJS)
    @echo -e "\n\n\t\t*** Linking complete! ***\n"

$(OBJS): $(OBJS_DIR)%.o : $(SRCS_DIR)%.c
    $(CC) $(CFLAGS) $(INCLUDES) \
        $<\
        -o $@

不幸的是,这不起作用,它给我一个错误

  

/ usr / bin / ld:找不到-ldmumps

     

/ usr / bin / ld:找不到-ldmumps_seq

     

/ usr / bin / ld:找不到-lmumps_common

     

/ usr / bin / ld:找不到-lmumps_common_seq

     

/ usr / bin / ld:找不到-lpord

     

/ usr / bin / ld:找不到-lpord_seq

我哪里错了?

更新:我实际上发现了我的makefile的错误。在链接步骤中,我在objects.o之前调用库,显然这是不可接受的。实际上,它试图将库链接到一些我尚未调用的目标文件。如果我把$(OBJ)放在$(OBJS)后一切正常。希望这对其他人有用。

1 个答案:

答案 0 :(得分:1)

表单链接器错误

  

/ usr / bin / ld:找不到-ldmumps

表示您要求链接的库不在库搜索路径中。

确保已安装MUMPS开发库。有时,开发组件与运行时组件分开打包和/或安装。开发库将具有libdmumps.solibdmumps.a形式的名称,并且不会在末尾添加任何额外的内容。

如果安装了dev库并且其名称与您的链接选项相对应,则必须是它们位于链接器默认搜索路径上的某个位置。这不会太不寻常。例如,MUMPS库可以安装在/ usr / lib / mumps,/ usr / lib64 / mumps或/ opt / mumps / lib中,默认情况下不会搜索任何库。如果存在库,但其目录不在默认搜索路径上,则必须在所有-L/path/to/library/dir等之前添加-ldmumps链接选项。

在任何情况下,如果您的主程序是用C语言编写的,那么您应该使用C链接驱动程序(gcc为您)来链接它。您的C代码可能必须通过错位名称引用Fortran函数,并且必须使用适合于调用所需函数的参数约定。您无法通过选择链接器来解决这个问题,因为所有函数调用的结构都是由编译器而不是链接器设置的。