gfortran makefile不能在mac上运行

时间:2013-06-27 08:42:03

标签: makefile gnu-make fortran90 gfortran

我正在尝试在我的mac中使用gfortran运行makefile。它在Fedora 18中编译没有问题,但是我无法在Mac OS 10.8.4中使用来自HPC的最后一个gfortran。 我是fortran的新手,所以有些亮点会受到赞赏。 这是Make文件:

# Makefile made to work with GNU Make

.DEFAULT:

BIN=bin
OBJ=obj

vpath= %$(OBJ)/.o    $(OBJ)
vpath= %.mod  $(OBJ)

EXES= pasos   \
      pasosng \
      pasosm  \
      trans   \
      cost    \
      lcal    \
      fluj    \
      loc     \
      eval    \
      impas   \
      imptra  \
      mats    \
      imploc  \
      matesp  \
      dimen

FC=gfortran
LN=gfortran

FCFLAGS=$(USER_FCFLAGS) -g3 -B $(OBJ) -J $(OBJ) @fc_options @fc_warnings

LFLAGS=$(USER_LFLAGS)

ifdef SystemRoot
    dotexe=.exe
endif

ifdef F_PROFILE
    FCFLAGS:=$(FCFLAGS) -pg
    LFLAGS:=$(LFLAGS) -pg
endif

ifdef F_TEST
    FCFLAGS:=-O0 -fbounds-check $(FCFLAGS)
else
    FCFLAGS:=-O3 $(FCFLAGS)
endif

COMPILE=$(FC) $(FCFLAGS) -o $@ -c $< 
LINK=$(LN) $(LFLAGS) -o $@ -Wl,-Map=$@.map $^

%.o : %.f90
    $(COMPILE)

all: prepare $(EXES)
$(OBJ)/%.o : %.f90
    $(COMPILE)


clean:
    rm -rf $(OBJ) $(BIN)

prepare: $(BIN) $(OBJ)

$(BIN):
    mkdir $(BIN)

$(OBJ):
    mkdir $(OBJ)


pasos: prepare $(BIN)/pasos$(dotexe)
    @echo $@

$(BIN)/pasos$(dotexe) : $(OBJ)/pasos.o \
        $(OBJ)/nodes.o  \
        $(OBJ)/io_list.o  \
        $(OBJ)/rcomm.o  \
        $(OBJ)/tparc.o  \
        $(OBJ)/zcomm.o  \
    $(OBJ)/rcomm.o \
    $(OBJ)/pcomm.o \
        $(OBJ)/getoptm.o  \
        $(OBJ)/control.o  \
        $(OBJ)/heap.o  \
        $(OBJ)/gener.o  \
        $(OBJ)/param.o  \
        $(OBJ)/ascii.o  \
        $(OBJ)/pcomm.o  \
    $(OBJ)/mensamod.o \
    $(OBJ)/optionsm.o \
        $(OBJ)/debugm.o 
    $(LINK)

文件较长,但我不知道是否需要了解错误。我在目录上运行make时得到的错误是:

tcapelle$ gnumake
gfortran  -o bin/pasos -Wl,-Map=bin/pasos.map obj/pasos.o obj/nodes.o obj/io_list.o obj/rcomm.o obj/tparc.o obj/zcomm.o obj/pcomm.o obj/getoptm.o obj/control.o obj/heap.o obj/gener.o obj/param.o obj/ascii.o obj/mensamod.o obj/optionsm.o obj/debugm.o
            ld: unknown option: -Map=bin/pasos.map
            collect2: error: ld returned 1 exit status
        gnumake: *** [bin/pasos] Error 1

编辑: 我改变了makefile

LINK=$(LN) $(LFLAGS) -o $@ -Wl,-Map=$@.map $^

LINK=$(LN) $(LFLAGS) -o $@ $^

它会编译一些错误,但它有效。 这是什么-Wl,-Map =事情呢?

1 个答案:

答案 0 :(得分:1)

问题是BSD链接器(与GNU链接器相反)不识别选项,如果它们通过等号(而不是空格)与相应的值分开。所以

ld -Map test.map

很好,而

ld -Map=test.map

不是。因此,您必须确保编译器以后一种形式将链接器选项传递给链接器。为此你需要

gfortran -Wl,-Map,test.map ...

您可以通过将LINK变量的定义更改为:

来实现
LINK=$(LN) $(LFLAGS) -o $@ -Wl,-Map,$@.map $^