2014-10-24 2 views
0

Я пытаюсь создать make-файл, чтобы скомпилировать C-программу, а затем связать ее с библиотекой fortran под названием MUMPS (которая также нуждается в библиотеках blas и pthread). Поэтому моя идея состояла в том, чтобы скомпилировать gcc, а затем связать gfortran. вот что я получил.makefile связывание библиотеки fortran с программой C

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)[email protected] $(LFLAGS) $(LIBS) \ 
     $(OBJS) 
    @echo -e "\n\n\t\t*** Linking complete! ***\n" 

$(OBJS): $(OBJS_DIR)%.o : $(SRCS_DIR)%.c 
    $(CC) $(CFLAGS) $(INCLUDES) \ 
     $<\ 
     -o [email protected] 

К сожалению, это не работает, и это дает мне ошибку

/usr/bin/ld: cannot find -ldmumps

/usr/bin/ld: cannot find -ldmumps_seq

/usr/bin/ld: cannot find -lmumps_common

/usr/bin/ld: cannot find -lmumps_common_seq

/usr/bin/ld: cannot find -lpord

/usr/bin/ld: cannot find -lpord_seq

, где я не права?

Обновление: на самом деле я нашел ошибку в своем make-файле. На этапе связывания я вызывал библиотеки перед объектами.o и, видимо, это неприемлемо. Фактически, он пытался связать библиотеки с некоторыми объектными файлами, которые я еще не вызывал. если я ставлю $ (LIBS) после $ (OBJS), все получится. Надеюсь, это может быть полезно кому-то другому.

+0

Это результат связи с '$ (FL)'? –

+0

Вы могли бы добавить что-то вроде 'echo $ (MUMPS_LIB_DIR)' в свою цель, чтобы проверить, правильно ли оно установлено? – francis

+0

извините за задержку. да, я проверил путь, и он правильный. – Stefano

ответ

1

компоновщика ошибки вида

/usr/bin/ld: cannot find -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 через искаженные имена, и ему придется использовать соглашения о аргументах, подходящие для вызова желаемых функций. Вы не можете обойти это по выбору компоновщика, потому что структура всех ваших вызовов функций настраивается компилятором, а не компоновщиком.

+0

На самом деле я проверил, и свинка не указана ни в одном из трех упомянутых вами каталогов, но она хорошо установлена, и пути правильные. – Stefano

+0

Кроме того, я также попытался сменить компоновщик на gcc -o, но я получил ту же ошибку – Stefano

+0

Я нашел ошибку, но у меня появилась новая ... Проблема была в переменной LIBS_DIR, которая была пуста, а полученный потерянных в фазе связывания. но теперь я получил эту ошибку: 'system_implicit_solver.c :(. text + 0x16ab): неопределенная ссылка на' dmumps_c'' и на googling, хотя кажется, из-за неправильной ссылки на BLAS. Я должен использовать BLAS системы. поэтому я сделал: 'LIBS_DIR =/usr/lib64' , но я все равно получаю ту же ошибку. так что, возможно, я снова не прав. – Stefano

Смежные вопросы