[英]makefile linking fortran library to a C program
我正在尝试构建一个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之前调用了库,显然这是不可接受的。 实际上,它试图将库链接到一些我尚未调用的目标文件。 如果我将$(LIBS)放在$(OBJS)之后,则一切正常。 希望这对其他人有用。
形式的链接器错误
/ usr / bin / ld:找不到-ldmumps
指示您要求链接的库不在库搜索路径中。
确保已安装MUMPS开发库。 有时,开发组件与运行时组件分开打包和/或安装。 开发库的名称将采用libdmumps.so
或libdmumps.a
的形式, libdmumps.so
不添加任何额外内容。
如果开发库已安装并且具有与您的链接选项相对应的名称,则必须确保它们位于链接器默认搜索路径之外的某个位置。 那不会太不寻常。 例如,MUMPS库可能安装在/ usr / lib / mumps,/ usr / lib64 / mumps或/ opt / mumps / lib中,默认情况下不会搜索其中的任何一个。 如果这些-L/path/to/library/dir
在,但是它们的目录不在默认搜索路径上,那么必须在所有-ldmumps
等之前添加-L/path/to/library/dir
链接选项。
无论如何,如果您的主程序是用C编写的,则应使用C链接程序驱动程序(适合您的gcc)链接它。 您的C代码可能必须通过变形的名称引用Fortran函数,并且必须使用适合于调用所需函数的参数约定。 您无法通过选择链接器来解决这个问题,因为所有函数调用的结构都是由编译器而不是链接器设置的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.