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

时间:2018-05-26 20:13:08

标签: fortran sublimetext3 sublimetext gfortran

我有一个Fortran 95代码,我通过终端窗口在我的Linux OS上编译和运行,首先编译各个模块,然后编译主程序。现在我尝试从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文本运行时,编译器无法检测与主程序文件位于同一文件夹中的模块。我也尝试通过编辑器构建单个模块,但它也没有用。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

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

需要记住的是,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已经支持{{} 1}}开箱即用。根据您可以使用的编程语言和环境,还有大量类似的工具。

如果你不需要创建一个知道如何构建你的程序的构建系统,通常需要手动编写一些模仿你在终端中做的事情来构建你的程序。

您在问题的评论中提到您使用make来运行执行Makefile工作的文件。要创建执行此操作的自定义构建系统,您可以执行以下操作:

  • 从菜单
  • 中选择sh
  • 修改模板Tools > Build System > New Build System...文件以运行相应的命令
  • 将结果保存为默认位置的sublime-build文件.Sublime会提示您(您的sublime-build文件夹)。

按照这些步骤操作后,User菜单中会显示与您保存的文件同名的版本。

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

Tools > Build System

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

在首次将当前目录切换到您当前正在编辑的文件的位置后,这将使用shell执行Automatic。您可以根据需要进行调整,例如更改正在执行的文件的名称,并确保工作目录正确,等等。

有关Official Documentation工作原理以及可供选择的选项的更多信息,请参阅build systems