fortran - 如何从 sublime 文本运行 gfortran 代码?

标签 fortran sublimetext3 sublimetext gfortran

我有一个 Fortran 95 代码,我通过终端窗口在我的 Linux 操作系统上编译和运行,首先编译各个模块,然后编译主程序。现在我正在尝试从 sublime text 3.0 版运行相同的代码,而不使用终端窗口。我从这个视频中得到了动力:https://www.youtube.com/watch?v=_eZyTNthJG4

但是当我ctrl+b ,构建代码,它提供以下控制台输出:

/tmp/cc4nYhyn.o: In function `MAIN__':
problem_main.f95:(.text+0x2e5): undefined reference to `__universal_parameter_declaration_MOD_compute_starts'
problem_main.f95:(.text+0x33e): undefined reference to `__array_creator_MOD_linear_spaced'
problem_main.f95:(.text+0x356): undefined reference to `__derivatives_MOD_dydx'
problem_main.f95:(.text+0x3e4): undefined reference to `__ode_solver_MOD_heun'
problem_main.f95:(.text+0x69e): undefined reference to `__universal_parameter_declaration_MOD_compute_ends'
problem_main.f95:(.text+0x6b0): undefined reference to `__universal_parameter_declaration_MOD_compute_ends'
problem_main.f95:(.text+0x6b8): undefined reference to `__universal_parameter_declaration_MOD_compute_starts'
problem_main.f95:(.text+0x6c4): undefined reference to `__universal_parameter_declaration_MOD_compute_time'
problem_main.f95:(.text+0x726): undefined reference to `__universal_parameter_declaration_MOD_compute_time'
problem_main.f95:(.text+0x988): undefined reference to `__universal_parameter_declaration_MOD_data_write_ends'
problem_main.f95:(.text+0x99a): undefined reference to `__universal_parameter_declaration_MOD_data_write_ends'
problem_main.f95:(.text+0x9a2): undefined reference to `__universal_parameter_declaration_MOD_compute_ends'
problem_main.f95:(.text+0x9ae): undefined reference to `__universal_parameter_declaration_MOD_data_write_time'
problem_main.f95:(.text+0xa10): undefined reference to `__universal_parameter_declaration_MOD_data_write_time'
problem_main.f95:(.text+0xa77): undefined reference to `__universal_parameter_declaration_MOD_plot_ends'
problem_main.f95:(.text+0xa89): undefined reference to `__universal_parameter_declaration_MOD_plot_ends'
problem_main.f95:(.text+0xa91): undefined reference to `__universal_parameter_declaration_MOD_data_write_ends'
problem_main.f95:(.text+0xa9d): undefined reference to `__universal_parameter_declaration_MOD_plot_time'
problem_main.f95:(.text+0xaa5): undefined reference to `__universal_parameter_declaration_MOD_plot_ends'
problem_main.f95:(.text+0xaad): undefined reference to `__universal_parameter_declaration_MOD_compute_starts'
problem_main.f95:(.text+0xab9): undefined reference to `__universal_parameter_declaration_MOD_total_time'
problem_main.f95:(.text+0xb1b): undefined reference to `__universal_parameter_declaration_MOD_plot_time'
problem_main.f95:(.text+0xbad): undefined reference to `__universal_parameter_declaration_MOD_total_time'
collect2: error: ld returned 1 exit status
[Finished in 0.1s with exit code 1]
[shell_cmd: gfortran '/home/vikash/Work/Fort_test/problem_main.f95' -o '/home/vikash/Work/Fort_test/problem_main']
[dir: /home/vikash/Work/Fort_test]
[path: /home/vikash/bin:/home/vikash/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games]

从 sublime 文本运行时,编译器似乎无法检测到与主程序文件位于同一文件夹中的模块。我也尝试通过编辑器构建单个模块,但它也没有工作。我该如何解决?

最佳答案

Sublime 能够执行您定义的任意外部程序或一系列命令,这是 Sublime 中构建系统工作方式的核心。构建系统本质上只是一组特定的规则,用于构建程序、运行程序或执行其他一些任务,例如在您处理网页时在浏览器中加载网页。

需要记住的是,Sublime 是一个文本编辑器而不是一个 IDE,因此像构建程序这样的事情可能不像你在其他软件中所期望的那样工作。这通常会让你措手不及,因为尽管 Sublime 在这方面非常强大,但它并不能为你处理所有底层细节,而是依赖你来填补空白。

在您的特定情况下,您的问题的症结似乎是您的程序由多个模块组成,但是您正在使用的构建系统正在尝试仅编译和链接您当前正在编辑的文件。

Sublime 没有提供对 Fortran 的支持,所以你可能已经安装了一个包来提供 Fortran 支持。 Fortran包包含以下 GFortran.sublime-build文件在这里用作说明:

{
    "cmd": ["gfortran", "${file}",  "-o",  "${file_base_name}"],
    "file_regex": "^(?xi:( ^[/] [^:]* ) : (\\d+) : (\\d+) :)",
    "working_dir": "${file_path}",
    "selector": "source.modern-fortran, source.fixedform-fortran",
    "syntax": "GFortranBuild.sublime-syntax",
    "windows": {
        "cmd": ["gfortran", "${file}", "-o", "${file_base_name}.exe"]
    },
    "variants":
    [
        {
            "name": "Run",
            "shell_cmd": "gfortran \"${file}\" -o \"${file_base_name}\" && \"./${file_base_name}\"",
            "shell": true,
            "windows": {
                "cmd": ["gfortran", "${file}", "-o", "${file_base_name}.exe", "&&", "${file_base_name}.exe"]
            }
        }
    ]
}

简而言之,这个构建系统只能编译当前文件。或 编译当前文件,然后运行结果;其他任何事情都“太复杂”以至于无法理解。这听起来像是您遇到的问题;当前文件正在编译和链接,而不考虑需要的其余文件,因此无法链接。

这里的解决方案是使用或制作一个构建系统来完成您在终端中所做的事情;逐个编译各个模块,然后将它们链接到主程序中。

我最好的建议是为适当的工作使用适当的工具;例如 make可以给它一个简单的控制文件,告诉它哪些文件组成了你的项目,它负责了解需要编译的内容,并且 Sublime 已经支持 make盒子外面。根据您也可以使用的编程语言和环境,有很多类似的工具。

如果您需要创建一个知道如何构建程序的构建系统,这通常涉及编写一些模仿您在终端中手动执行的操作以构建程序的内容。

您在对问题的评论中提到您使用 sh运行一个执行 Makefile 工作的文件。要创建执行此操作的自定义构建系统,您将执行以下操作:
  • 选择 Tools > Build System > New Build System...来自菜单
  • 修改模板sublime-build文件以运行适当的命令
  • 将结果另存为 sublime-build默认位置的文件 Sublime 会提示您(您的 User 文件夹)。

  • 按照这些步骤操作后,与您保存的文件同名的构建将出现在 Tools > Build System 中。菜单。

    这样的构建系统可能如下所示:

    {
        "shell_cmd": "sh myfile.txt",
        "working_dir": "${file_path}",
        "selector": "source.modern-fortran, source.fixedform-fortran",
    }
    
    selector使这个构建系统在 fortran 文件中自动可用(至少在上述软件包定义的语法中),在这种情况下,您可以将构建系统设置为 Automatic并为您选择它,或者您可以将构建显式设置为此构建文件以确保使用它。

    这将使用 shell 执行 myfile.txt在首先将当前目录切换到您当前正在编辑的文件的位置之后。您可以根据需要进行调整,例如通过更改正在执行的文件的名称并确保工作目录在其他方面正确,等等。

    引用 Official Documentation更多信息build systems工作以及您可以使用哪些选项。

    关于fortran - 如何从 sublime 文本运行 gfortran 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50546646/

    相关文章:

    派生数据类型中的 Fortran、参数和静态表

    pointers - 如何将 Fortran 指针传递给子例程?

    python - 如何删除Python中单词之间的多个空格,而不需要前导空格

    editor - 如何在 Sublime Text 2 中用制表符替换四个空格?

    sublimetext - ESLint找不到插件 “eslint-plugin-react”

    debugging - 您为 GFORTRAN 调试器/编译器设置哪些标志来捕获错误代码?

    fortran - 有没有办法在基本函数中进行参数检查?

    sublimetext3 - 禁用平滑滚动?

    sublimetext3 - Sublime Text 3 Find - 突出显示所有结果,而不是白色轮廓

    python - 如何使用 sublime 插件 api 创建新布局并在每个单元格中打开一个文件