我正在尝试构建一个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)后一切正常。希望这对其他人有用。
答案 0 :(得分:1)
表单链接器错误
/ usr / bin / ld:找不到-ldmumps
表示您要求链接的库不在库搜索路径中。
确保已安装MUMPS开发库。有时,开发组件与运行时组件分开打包和/或安装。开发库将具有libdmumps.so
或libdmumps.a
形式的名称,并且不会在末尾添加任何额外的内容。
如果安装了dev库并且其名称与您的链接选项相对应,则必须是它们位于链接器默认搜索路径上的某个位置。这不会太不寻常。例如,MUMPS库可以安装在/ usr / lib / mumps,/ usr / lib64 / mumps或/ opt / mumps / lib中,默认情况下不会搜索任何库。如果存在库,但其目录不在默认搜索路径上,则必须在所有-L/path/to/library/dir
等之前添加-ldmumps
链接选项。
在任何情况下,如果您的主程序是用C语言编写的,那么您应该使用C链接驱动程序(gcc为您)来链接它。您的C代码可能必须通过错位名称引用Fortran函数,并且必须使用适合于调用所需函数的参数约定。您无法通过选择链接器来解决这个问题,因为所有函数调用的结构都是由编译器而不是链接器设置的。