在 Ubuntu 上编译 Fortran netCDF 程序

2023-11-24

好的,这里是新手问题。

我正在尝试编译simple_xy_wr.f90-- 一个 netCDF 示例程序 -- 在 Ubuntu 上使用 gfortran,我一定做了一些非常愚蠢的事情;我没有太多编译 Fortran 的经验。

首先,我有libnetcdf-dev安装的软件包,其中包括类似的文件

/usr/lib/libnetcdf.a
/usr/lib/libnetcdff.a
/usr/include/netcdf.mod

所以,我尝试使用(各种命令等)编译代码

f95 -o xy -I/usr/include/ -L/usr/lib/ -lnetcdff -lnetcdf simple_xy_wr.f90

我得到以下输出

/tmp/ccE6g7sr.o: In function `check.1847':
simple_xy_wr.f90:(.text+0x72): undefined reference to `__netcdf_MOD_nf90_strerror'
/tmp/ccE6g7sr.o: In function `MAIN__':
simple_xy_wr.f90:(.text+0x284): undefined reference to `__netcdf_MOD_nf90_create'
simple_xy_wr.f90:(.text+0x2b6): undefined reference to `__netcdf_MOD_nf90_def_dim'
simple_xy_wr.f90:(.text+0x2e8): undefined reference to `__netcdf_MOD_nf90_def_dim'
simple_xy_wr.f90:(.text+0x432): undefined reference to `__netcdf_MOD_nf90_def_var_manydims'
simple_xy_wr.f90:(.text+0x468): undefined reference to `__netcdf_MOD_nf90_enddef'
simple_xy_wr.f90:(.text+0x4aa): undefined reference to `__netcdf_MOD_nf90_put_var_2d_fourbyteint'
simple_xy_wr.f90:(.text+0x4cb): undefined reference to `__netcdf_MOD_nf90_close'
collect2: error: ld returned 1 exit status

我认为我包含了正确的库。例如。看来 __netcdf_MOD_nf90_strerror 应该在那里:

$ nm /usr/lib/libnetcdff.a | grep __netcdf_MOD_nf90_strerror
000000000004a100 T __netcdf_MOD_nf90_strerror

我究竟做错了什么?

(FWIW,下面是我看过的一些相关参考文献。

  1. 使用 netcdf 库的未定义引用

  2. gfortran和NETCDF的编译问题

  3. 编译和运行 Fortran 程序 - 基本指南

)


链接器命令行上目标文件和档案的顺序是很重要在 Unix 系统上,因为默认链接器行为是仅在符合以下条件的档案中搜索符号定义:follow发现未解析引用的目标文件或存档称为单通道链接。

这意味着如果您的代码引用__netcdf_MOD_nf90_strerror,然后包含该符号定义的存档(libnetcdff.a) 必须出现after程序中的目标文件列表。libnetcdff.a本身引用 C 库中的符号libnetcdf.a,因此必须在之后链接libnetcdff.a。所以正确的链接顺序是:

/tmp/ccE6g7sr.o libnetcdff.a libnetcdf.a

where /tmp/ccE6g7sr.o是汇编器从编译的源文件生成的临时目标文件。编译代码的正确命令行是:

f95 -o xy -I/usr/include/ simple_xy_wr.f90 -lnetcdff -lnetcdf

在这种情况下,不会直接调用链接器,而是由编译器调用。 GCC 编译器将所有与链接相关的内容以相同的顺序传递给名为的中间实用程序collect2然后调用实际的链接器ld.

请注意,如果 netCDF 库档案的共享对象版本也存在(即有libnetcdff.so and libnetcdf.so),那么链接器会更喜欢它们而不是静态档案(除非使用-static选项),最终链接阶段将由运行时链接编辑器(RTLD)处理(/lib64/ld-linux-x86-64.so.2在 Ubuntu 上)。在这种情况下,与您的问题中相同的命令行实际上会成功而不会出现链接错误,尽管两个库都位于引用它们的代码之前,因为 RTLD 在加载可执行文件时将解析缺少的符号引用文件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Ubuntu 上编译 Fortran netCDF 程序 的相关文章

  • C++/Fortran 中贝塞尔函数的集成 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 如何在 Fortran 或 和 C 中对包含贝塞尔函数的方程进行从 0 到 无穷大 的数值积分 我在matlab中做了 但对于较大的输入和特
  • 不确定 openmp 循环中应该共享或私有什么

    我有一个更新矩阵 A 的循环 我想将其设为 openmp 但我不确定哪些变量应该共享和私有 我本以为只有 ii 和 jj 就可以工作 但事实并非如此 我想我也需要在某个地方进行 OMP ATOMIC UPDATE 该循环仅计算 N 和 N
  • 如何使用 NCO 编辑 netcdf 文件中的全局属性

    我正在尝试编辑 netcdf 文件中的全局属性之一 START DATE 2016 05 12 00 00 00 我想将日期字符串更改为另一个日期 如何使用 nco 包执行此操作 我已经看到我可以使用 ncatted a D dbg lvl
  • 使用 Fortran (CLFORTRAN) 在 OpenCL 中将两个选项作为参数传递

    当我的主机程序采用 C 语言时 我可以传递两个选项作为 OpenCL 函数的参数 例如 我可以通过两个 标志到clCreateBuffer像这样的函数 clCreateBuffer context CL MEM READ ONLY CL M
  • 检查 netcdf linux 库版本

    如何确定我的系统中安装了哪个版本的 netcdf 库 有命令行吗 我尝试搜索 netcdf 发现了一堆文件 但无法确定版本号 有没有命令可以检查已安装的任何版本 我在ubuntu上 netCDF 提供nc config用于此目的的命令行工具
  • Fortran 读取混合文本和数字

    我正在使用 Fortran 90 读取包含以下格式数据的文件 number 125 var1 2 var2 1 var3 4 number 234 var1 3 var2 5 var3 1 我尝试了以下命令并且工作正常 read 2 tem
  • Fortran:向文件添加列(即跳过不同数量的水平空格)

    我是 Fortran f90 的初学者 一些看似简单的问题结果却导致严重头痛 感谢您帮助我解决这个问题 我的代码运行一个循环 处理数据并将它们写入文件 我希望将这些数据写入同一文件的列中 直到循环完成 OPEN unit 11 file f
  • 使用命令行查找数据文件的行数

    有一种常规方法 逐行读取并检查iostat每次读数时都会达到非零或负值 不过 我想打电话system command 例行公事和 使用wc l命令来计算数量 然后想要分配要放置数据的数组的维度 例如 我以两种方式打印行数 Program T
  • 时间数组在建模中超出范围?

    这些天我正在尝试使用新的气象数据 以 netcdf 格式而不是旧的 cray 格式给出 运行我的气候模型 模型编译顺利 但是当进行模拟时 模型在第一天运行良好 但在模拟的第二天就停止了 总是在同一时间步长 无论我使用哪个开始日期 错误是 f
  • 通过python从netCDF中提取特定位置的数据

    我是 Python 的新手 也是 NetCDF 的新手 如果我不清楚 请道歉 我有一个包含多个变量的 nc 文件 我需要以新的顺序从这些 nc 文件中提取数据 我的 nc 文件有 8 个变量 经度 纬度 时间 u10 v10 swh mwd
  • 如何用好Fortran语句标签?

    我正在开发一个用 Fortran 95 编写的模型 我对此完全陌生 语句标签的概念似乎很奇怪 到目前为止我只找到了标签可以由作者任意决定的解释 通常以 10 为增量 除了更容易地找出语句的结尾位置之外 这些标签还有其他实际用途吗 以及关于如
  • Fortran 函数:指针作为实际参数,目标作为形式

    我正在尝试破译 Fortran 代码 它将指向函数的指针作为实际参数传递 而形式参数则是目标 它在主程序中定义并分配一个 globalDATA 类型的指针 然后调用一个传递该指针的函数 module dataGLOBAL type glob
  • FORTRAN 写()

    在开始之前 我必须先声明一下 我是 FORTRAN 的新手 我正在维护 1978 年的一段遗留代码 它的目的是从文件中读取一些数据值 处理这些值 然后将处理后的值输出到另一个文本文件 给出以下 FORTRAN 代码 INTEGER NM S
  • 如何调用模块中子程序内部的函数?

    我有一个包含子例程的模块 该子例程又包含一个函数 我说use themodule在我的主程序中 我可以call thesubroutine 但是如何访问子例程中包含的函数呢 代码如下所示 module useful integer para
  • 最佳 Fortran IDE [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 stackoverflow上有人用Fortran吗 您使用什么 IDE 您认为哪一个是最好的 似乎我周围的很多人都对 Intel Visu
  • 在Java中将浮点数组写入文件

    我正在读取 NetCDF 文件 我想将每个数组作为浮点数组读取 然后将浮点数组写入新文件 如果我读取浮点数组 然后迭代数组中的每个元素 使用 DataOutputStream 我可以使其工作 但这非常非常慢 我的 NetCDF 文件超过 1
  • R:使用带有 .Call 和 C/C++ 包装器的 Fortran 子例程而不是 .Fortran 的优点?

    我有一个 R 包 它使用大量 Fortran 子例程来进行递归线性代数计算的嵌套循环 很大程度上依赖于 BLAS 和 LAPACK 例程 作为 Fortran 的接口 我使用 Fortran功能 我刚刚读过乔纳森卡拉汉的博客文章 http
  • Fortran的性能

    Fortran 的表现计算机语言基准游戏 http shootout alioth debian org 出奇的糟糕 今天的结果显示 Fortran 在两项四核测试中分别排名第 14 和第 11 在单核测试中排名第 7 和第 10 现在 我
  • 访问 Xarray 数据集时的 HDF5 警告

    我想了解导致我在以下情况下收到警告消息的原因 在之前的操作中 我创建了一些 NetCDF 文件并使用以下命令将它们保存到磁盘xarray to netcdf 在 jupyter 笔记本中对这些数据集进行惰性评估完全没问题 并且在以下情况下我
  • MPI_Gather 在最基本的代码中给出了 seg 错误

    我正在开发一个更大的程序 但我在 MPI Gather 上遇到了困难 我编写了一个最小的示例代码 请参见下文 program test use MPI integer ierr rank size double precision allo

随机推荐

  • 枚举类型布局与其基础类型兼容吗?

    我正在翻看n3690 即将出台的草案C 14标准 我在部分中看到7 2段落9 如果两个枚举类型具有相同的基础类型 则它们是布局兼容的 但是 我找不到任何说明枚举类型与其基础类型布局兼容的内容 对我来说 考虑到 底层类型 含义的合理语义 这似
  • 搁置线程是否是最佳选择?

    应用程序有一个辅助线程 该线程并不意味着一直运行 但主进程可以经常调用它 所以 我的问题是 就 CPU 性能而言 什么是更优化的 在不使用线程时挂起线程 还是保持线程处于活动状态并使用 WaitForSingleObject 函数来等待来自
  • Visual Studio 中出现“无效模板参数”错误,但 GCC 中没有

    假设你有代码 template
  • 如何使用 Minitest 登录 Devise to Test Controller

    我是 Rails 测试的新手 在遵循一些在线教程后 我可以设置并运行模型测试 但是 当尝试测试控制器时 测试失败 因为它被重定向到登录页面 我已尝试了网上可以找到的所有登录设备的说明 但仍然无法登录并继续 如果有人能提供帮助并给我前进的方向
  • Python 中的列表推导式用于计算列表的最小值和最大值

    我有以下代码来计算列表的最小值和最大值 以节省内存效率 x min float inf x max float inf for p in points in list x min min x min p x max max x max p
  • Pickle 和装饰类(PicklingError:不是同一个对象)

    以下最小示例使用虚拟装饰器 它仅在构造装饰类的对象时打印一些消息 import pickle def decorate message def call decorator func def wrapper args kwargs prin
  • 环视 积极 消极 向后展望

    在谷歌上搜索 vsvim Lookahead 或 Lookbehind 后wiki我似乎不知道如何 或者是否支持前瞻或后视 正数或负数 以及如何使用它们 如果是 我尝试过几种不同的syntaxes like ze lt let w lt l
  • Microsoft Visual Studio ~ C/C++ 运行时库 ~ 静态/动态链接

    我是 Microsoft Visual Studio 用户 我的问题是关于 C C 运行时库 我创建了一个 空项目 其中包含 cpp 源文件 main cpp 其中包含以下代码 include
  • Spring Boot中构造函数的参数0

    启动我的应用程序时遇到问题 有人可以帮我解决这个问题吗 Parameter 0 of constructor in com journaldev elasticsearch service BookServiceImpl required
  • 在 Android 的 Xamarin 表单中使用警报管理器安排通知

    我创建了一个依赖项来显示通知 在 My DeviceDetails Droid cs 中 我将闹钟设置为 30 秒 当应用程序运行时 本地通知功能可以完美运行 活动但当我杀死应用程序 关闭应用程序 时警报接收器 没有被叫到 public v
  • Xamarin Forms InitializeComponent 不存在

    我正在学习 Visual Studio 2015 的 Xamarin Forms 并尝试使用 Xaml 创建一个简单的共享项目 但我不断收到 InitializeComponent 不存在 以及对 cs 类中 Xaml 控件的任何引用 据我
  • Delphi XE2:在 CHM 中跳到锚点?

    在Delphi XE2程序中 如何跳转到CHM帮助文件主题内的锚点 锚点具有以下格式 从显示 CHM 文件的 HTML HelpViewer 中的主题页面源中提取 a a 我尝试了以下方法 Application HelpJump MyTo
  • Selenium Webdriver 添加到 LocalStorage

    我尝试将以下标志添加到LocalStorage但它不起作用 localStorage setItem ClientRedirectEnabled true 我的代码如下 public void FlagIntroduce throws In
  • 将多个 SVN 存储库合并为一个

    在考虑了我之前问题的答案之后 一个 SVN 存储库还是多个 我决定将我拥有的 4 个左右存储库合并为一个 这当然引出了一个问题 最好的方法是什么 有没有办法组合两个或多个存储库来维护两者的版本历史记录 Edit 我还应该指出 我正在使用 A
  • 如何观察ng-content中input元素的变化

    当子组件观察到输入变化时如何调用父组件的函数 下面是 HTML 结构 app comopnent html
  • pandas DataFrame 单列中的多个值

    我正在将一些数据从 XML 解析为 pandas DataFrame XML 数据大致如下所示
  • PHP 中的 HTTP if-none-match 和 if-modified-since 以及 304 说明

    我的问题是当我收到 HTTP 304 未修改 时如何回复bothif none match 和 if modified since 来自代理 客户端请求 来自 RFC 2616 第 14 26 节 http www w3 org Proto
  • 如何对齐两个 y 轴刻度的网格线?

    我正在 y 轴上绘制两个具有不同单位的数据集 有没有办法让刻度线和网格线在两个 y 轴上对齐 第一张图片显示了我得到的东西 第二张图片显示了我想要得到的东西 这是我用来绘制的代码 import seaborn as sns import n
  • 如何缩短 List>>?

    我想在轻量级结构中存储键值对列表的列表 这似乎太麻烦了 什么更好 List gt 会增加很多开销吗 还有哪些其他选择 考虑使用别名作为简写 namespace Application using MyList List
  • 在 Ubuntu 上编译 Fortran netCDF 程序

    好的 这里是新手问题 我正在尝试编译simple xy wr f90 一个 netCDF 示例程序 在 Ubuntu 上使用 gfortran 我一定做了一些非常愚蠢的事情 我没有太多编译 Fortran 的经验 首先 我有libnetcd