1

我正在尝试在我的 mac 中运行带有 gfortran 的 makefile。它在 Fedora 18 中编译没有问题,但我无法使用 HPC 的最后一个 gfortran 使其在 Mac OS 10.8.4 中工作。我是 fortran 的新手,所以会很感激。这是制作文件:

# 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= 有什么作用?

4

1 回答 1

1

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

ld -Map test.map

很好,而

ld -Map=test.map

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

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

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

LINK=$(LN) $(LFLAGS) -o $@ -Wl,-Map,$@.map $^
于 2013-06-27T15:53:48.633 回答