make: *** Нет правил, чтобы сделать цель - gfortran - PullRequest
0 голосов
/ 11 июня 2018

Я пытаюсь скомпилировать код - этот код использует несколько библиотек, и для начала я пытаюсь создать make-файл, чтобы получить одну библиотеку, у меня возникли трудности.это make-файл

HOME        = $(shell pwd)
LIBNA       = libbv.a
LIBZP       = $(HOME)/$(LIBNA)

# FFLAGC      = -Mextend -Msave -g -C -Mchkfpstk -Mchkptr -fpic -Ktrap=fp


FC = gfortran
 ifeq ($(OSTYPE),linux)
        FC = pgf95 -Msave -fpic
 endif

# per il gfortran
 FFLAGC      = -g -Wall-ffixed-line-length-0 -Mextend -Msave -g -C -Mchkfpstk -Mchkptr -fpic -Ktrap=fp

# FC = gfortran
#

SOURCE = \
filename1.f\
filename2.f\
...
filenamen.f


.SUFFIXES: .f




OBJ = $(SRCS:.f=.o)

.f.o:
    $(FC) $(FFLAG)   -c   $< $@


$(LIBZP): $(LIBZP)($(OBJ))
    ar -r $(LIBZP) $?
    rm -f $?

это make-файл, который я использую.Я получаю сообщение об ошибке

make: *** Нет правила для создания цели absolutepath/libbv.a()', needed by absolute_path / libbv.a '.Стоп.

Мне было интересно, может ли кто-нибудь из вас помочь

1 Ответ

0 голосов
/ 11 июня 2018

Ну, ваше сообщение об ошибке показывает это:

absolutepath/libbv.a()

без скобок.Но ваш make-файл имеет следующее:

$(LIBZP): $(LIBZP)($(OBJ))

с $(OBJ) в скобках.Очевидно, что $(OBJ) расширяется до пустой строки.Почему это так?

Ну, OBJ устанавливается здесь:

OBJ = $(SRCS:.f=.o)

на основе SRCS.Ну, что эта переменная содержит?

Ага.Ничего, потому что это никогда не установлено.Вы устанавливаете это, хотя:

SOURCE = \
    ...

SOURCE! = SRCS, поэтому вы модифицируете пустую переменную, а OBJ - пустая строка.

Я неуверен, почему вы ставите перед префиксом текущий каталог ... вот куда он будет идти по умолчанию, если вы не укажете ни один каталог.В любом случае вы можете использовать $(CURDIR) вместо запуска $(shell pwd).

Если вы все равно собираетесь использовать GNU make, я рекомендую вам использовать правила шаблонов, а не суффиксные правила: они гораздо прощечитать / понимать:

%.o : %.f
        $(FC) $(FFLAG) -c $< $@

Также вам не нужно -o здесь до $@?Я не использую компиляторы Fortran, но я бы предположил, что они работают более или менее так же, как компиляторы C / C ++.

...