gpt4 book ai didi

makefile - 大型项目的 FORTRAN Makefile

转载 作者:行者123 更新时间:2023-12-02 10:46:37 25 4
gpt4 key购买 nike

我正在 Fortran95 中开始一个新项目,该项目应该很快就会变大(很多模块)。目前我只有

  • 输出.f90
  • Moldyn.f90

  • output.f90 包含一个带有几个公共(public)变量、两个公共(public)子例程和两个私有(private)子例程的模块。 Moldyn.f90 包含调用 output.f90 中包含的两个公共(public)子例程的主程序。

    这是我第一次处理大型项目,因此我想通过创建一个通用且易于适应的 Makefile 来尽可能地自动化编译和链接。我之前创建的 Makefile 只是“硬编码”编译和链接语句,对于一个大型项目,我想自动化这个过程(但不使用其他工具作为 CMake)。

    这是我的尝试,不幸的是不起作用:
    # ========
    # Makefile
    # ========

    # Makefile name
    MF = Makefile

    # ==========
    # Executable
    # ==========

    # Executable name
    EXE = $(BINDIR)/moldyn.x

    # ========
    # Compiler
    # ========

    # Fortran compiler
    FC = gfortran

    # Fortran flags
    FFLAGS = -O2 -Wall -Warray-bounds -fbounds-check

    # ===========
    # Directories
    # ===========
    SRCDIR = src
    BINDIR = bin
    OBJDIR = obj
    MODDIR = mod

    # ========
    # Suffixes
    # ========

    .SUFFIXES:
    .SUFFIXES: .f90 .o .mod

    # ===================
    # Sources and objects
    # ===================

    SRC = \
    $(SRCDIR)/moldyn.f90\
    $(SRCDIR)/output.f90

    OBJ = $(SRC:$(SRCDIR)%.f90=$(OBJDIR)%.o)

    # =====
    # Rules
    # =====

    all:
    @echo $(SRC)
    @echo $(OBJ)

    moldyn: $(OBJDIR)/.o $(EXE)

    $(EXE): $(OBJ)
    $(FC) $(FFLAGS) -o $(SRCDIR)/$@ $(OBJ)

    $(OBJDIR)/.o:
    $(FC) $(FFLAGS) -c $(SRC)

    $(OBJ): $(MF)

    # =======
    # Folders
    # =======

    $(BINDIR):
    mkdir -p $(BINDIR)

    $(OBJDIR):
    mkdir -p $(OBJDIR)

    $(MODDIR):
    mkdir -p $(MODDIR)

    # =====
    # Clean
    # =====

    clean:
    rm -f src/*~
    rm -fr $(BINDIR) $(OBJDIR) $(MODDIR)

    我认为困惑来自这样一个事实,即我在 src/文件夹中有源代码,并且我想在 obj/文件夹中创建 .o 并在 bin/文件夹中创建可执行文件。 .mod 文件也起作用,因为它们是在 dase 文件夹中创建的(那里有 makefile),但我真的不知道如何处理它们(这是我的第一个 Fortran 项目)。

    谁能帮助我了解编译问题的来源?我得到的错误如下:
    gfortran -O2 -Wall -Warray-bounds -fbounds-check -c src/moldyn.f90 

    src/output.f90
    src/moldyn.f90:20.6:

    use output, only: title, gpl
    1
    Fatal Error: Can't open module file 'output.mod' for reading at (1): No such file or directory
    make: *** [obj/.o] Error 1

    并且似乎与 .mod 文件有关。

    最佳答案

    我认为您的 makefile 问题在这篇 Stack Overflow 帖子中得到了很好的回答:
    Automatic Ordering of Obejct Files "*.o" in a Fortran Makefile .

    至于您的具体错误,您需要包含 -I $(OBJDIR)在你的 gfortran 调用中告诉它你的 *.mod 文件在哪里。

    gfortran -O2 -Wall -Warray-bounds -fbounds-check -I obj/ -c src/moldyn.f90

    不过,请重新考虑 CMake。我们有一个非常大的 Fortran/C/C++ 代码库(约 800,000 行 Fortran/约 900,000 行 C/C++)并且对 CMake 非常满意。对我们来说,我们需要在 Windows/Mac/Linux 上构建/测试/部署,而 CMake 为我们完成了这些工作。我们还使用 GNU 和 Intel 编译器,它可以处理这些问题。我们还有调试和发布版本以及覆盖测试和内存泄漏版本。它还提供了一个带有 CTest 的测试工具和一个带有 CDash 的持续集成仪表板。一旦您的项目变得更大,您就可以迁移到它。因此,当您的项目很小时,请使用 Makefile 方法。如果您开始感觉到这些限制,那么不要将大量时间花在一些精心制作的 Makefile 生成方案上——我一直在走这条路。只需切换到 CMake——这里有一个指向 example of CMake for Fortran 的奖励链接.当我提供不请自来的建议时,不要进行“源代码”构建。原因在 this blog post by Jussi Pakkanen 上总结得很好.

    关于makefile - 大型项目的 FORTRAN Makefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38276190/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com