【问题标题】:How do I run gfortran code from sublime text?如何从 sublime 文本运行 gfortran 代码?
【发布时间】:2018-05-26 20:13:08
【问题描述】:

我有一个 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 text 运行时,编译器似乎无法检测到与主程序文件位于同一文件夹中的模块。我也尝试通过编辑器构建单个模块,但它也没有工作。我该如何解决这个问题?

【问题讨论】:

  • 您使用什么构建系统来执行此操作?如果您在终端中执行相同的操作,它执行的命令对您有用吗?
  • 它是工具-构建系统-Gfortran。当我执行 ctrl + shift B 时,我可以选择 gfortran - run,但这也无济于事。
  • 在通过终端窗口运行时,我只是“sh”了一个 .txt 文件,它完成了 makefile 的工作并考虑了各个模块之间的依赖关系。文件内容为:
  • rm *.mod *.o vikash_solution; gfortran -c lib_universal_parameter_declaration.f95; gfortran -c lib_local_parameter_declaration.f95 gfortran -c lib_array_creator.f95; gfortran -c lib_derivatives.f95; gfortran -c lib_ode_solver.f95; gfortran -c 问题_main.f95; gfortran lib_universal_parameter_declaration.o lib_local_parameter_declaration.o lib_array_creator.o lib_derivatives.o lib_ode_solver.o question_main.o -o vikash_solution; ./vikash_solution;证明 *.eps
  • Sublime 不附带 `GFortran` 构建系统,因此它可能来自某些软件包。从您的描述看来,它只是试图编译和构建当前文件。出于您的目的,制作与在终端中执行相同操作的自定义构建可能更容易。

标签: fortran sublimetext3 sublimetext gfortran


【解决方案1】:

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 out的盒子。根据您的编程语言和环境,有大量类似的工具可供您使用。

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

您在 cmets 中提到您使用 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 的工作原理以及您可以使用哪些选项的更多信息。

【讨论】:

    猜你喜欢
    • 2012-01-23
    • 1970-01-01
    • 2014-03-01
    • 2014-10-08
    • 2014-08-05
    • 1970-01-01
    相关资源
    最近更新 更多