好的,这里有新问题.

我正在尝试编译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,我看过的一些相关参考文献如下.

> undefined reference using netcdf library
> Compiling problems with gfortran and NETCDF
> Compiling and Running Fortran Programs – a basic guide

)

链接器命令行上的目标文件和存档的排序在Unix系统上非常重要,因为默认链接器行为是仅在跟踪目标文件或存档的存档中搜索符号定义,其中找到未解析的引用,称为单通道链接.

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

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

其中/tmp/ccE6g7sr.o是汇编程序从编译的源文件生成的临时目标文件.然后,编译代码的正确命令行是:

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

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

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

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

  1. ios – -ObjC标志能否有选择地应用于静态库?

    TL;DR如何使-ObjC链接器标志针对特定的静态库,而不是我链接的所有静态库,以避免未使用的目标文件与我的应用程序链接?

  2. ios – Xcode 7.1 PrototypeTools链接器错误(仅限模拟器)

    我正在尝试使用Xcode7.1在iOS模拟器中运行我的应用程序,但我收到链接器错误.这是错误:clang:错误:链接器命令失败,退出代码为1这似乎是一个新问题,因为我在升级到新的Xcode之前没有它.我在Google上搜索过,但是这个问题几乎没有相关主题.有趣的是,该应用程序在设备上运行良好.我已经尝试重置模拟器并再次清洁/建造,但两者都没有奏效.有没有其他人遇到过这个问题,你能提供什么建议吗?

  3. 通过cocoapods安装适用于iOS的Google Maps SDK会导致链接器错误

    我正在尝试使用cocoapods安装适用于iOS版本1.3.0的GoogleMapsSDK.实际上安装过程很成功,但是当我尝试使用框架时,app构建过程会返回链接器错误,例如:由于某种原因,链接器无法找到框架.我的cocoapods版本是0.20.1.XCode4.6.2.除了谷歌地图SDK,我的项目还有另外两个通过cocoapods添加的库.这是我的Podfile:提前致谢.解决方法您应该看到一个文件“Pods.xcconfig”,其中包含pod正在使用的框架.将应用程序的目标配置更改为基于CocoaP

  4. ios – 不同作用域中相同命名常量的链接器错误

    我有一个名为“ID_KEY”的常量,它在3个单独的.m文件的顶部声明,其中没有包含其他文件.声明如下:而其他两个类也是如此.但是我收到一个链接器错误抱怨同名的多个定义.我的问题是为什么链接器抱怨这个呢?

  5. .dylib在Debug中链接,在XCode中找不到适用于iPhone的版本

    所以我已经将libxml2.2.dylib库包含在我的iPhoneXCode项目中,以创建一些Xml和XPath解析实用程序.当我编译并运行在模拟器和设备的调试模式时,我没有问题,但是,当我切换到发布模式我得到…

  6. 在编译的iOS应用程序(IPA)中加密内容

    由于IPA结构只是一个压缩文件,包含编译代码媒体内容,如图像&音频,我如何保护内容免受别人的窃取?是否有加密可以添加到IPA?

  7. ios – AudioKit 4.1 Mach-O链接器错误Swift 4

    我正在尝试使用AudioKit4.1来学习基础教程.我首先在项目中导入了AudioKit框架,如下图所示.导入AudioKit框架后,我在ViewController中添加了几行代码,如下所示:运行代码后,我得到59错误,如下图所示.你是如何解决的?解决方法从版本4.1开始,AudioKit现在作为静态框架提供.由于所有内部C代码,它取决于标准C库.这种依赖关系曾经由动态链接器自动解决,但不再是.使这些错误消失的最简单方法是在Xcode中的目标设置中添加-lstdc链接器标志.

  8. ios – Swift 4向后兼容性

    一起使用.有没有办法在两个版本的Xcode中使这个工作?Swift4是否应该向后兼容?

  9. ios – apple mach-o链接器错误链接器命令失败,退出代码为1(使用-v查看调用)

    2我正在使用带有核心数据的ObjectiveC,我收到一个错误:AppleMach-O链接器错误,链接器命令失败,退出代码为1解决方法您需要打开详细说明.

  10. Swift与OC混合编译

    SWift调用OC新建swift文件此时系统自动生成-Bridging-Header.h文件并且TARGETS->BuildSettings->Objective-CBridgingHeader(搜索bridg)选项中会自动填入以上头文件的路径在-Bridging-Header.h中#import要调用的OC对象头文件OC调用Swift在OC文件中#import“

随机推荐

  1. crontab发送一个月份的电子邮件

    ubuntu14.04邮件服务器:Postfixroot收到来自crontab的十几封电子邮件.这些邮件包含PHP警告.>我已经解决了这些警告的原因.>我已修复每个cronjobs不发送电子邮件(输出发送到>/dev/null2>&1)>我删除了之前的所有电子邮件/var/mail/root/var/spool/mail/root但我仍然每小时收到十几封电子邮件.这些电子邮件来自cronjobs,

  2. 模拟两个ubuntu服务器计算机之间的慢速连接

    我想模拟以下场景:假设我有4台ubuntu服务器机器A,B,C和D.我想在机器A和机器C之间减少20%的网络带宽,在A和B之间减少10%.使用网络模拟/限制工具来做到这一点?

  3. ubuntu-12.04 – 如何在ubuntu 12.04中卸载从源安装的redis?

    我从源代码在Ubuntu12.04上安装了redis-server.但在某些时候它无法完全安装,最后一次makeinstallcmd失败.然后我刚刚通过apt包安装.现在我很困惑哪个安装正在运行哪个conf文件?实际上我想卸载/删除通过源安装的所有内容,只是想安装一个包.转到源代码树并尝试以下命令:如果这不起作用,您可以列出软件自行安装所需的步骤:

  4. ubuntu – “apt-get source”无法找到包但“apt-get install”和“apt-get cache”可以找到它

    我正在尝试下载软件包的源代码,但是当我运行时它无法找到.但是当我运行apt-cache搜索squid3时,它会找到它.它也适用于apt-getinstallsquid3.我使用的是Ubuntu11.04服务器,这是我的/etc/apt/sources.list我已经多次更新了.我尝试了很多不同的debs,并没有发现任何其他地方的错误.这里的问题是你的二进制包(deb)与你的源包(deb-src)不

  5. ubuntu – 有没有办法检测nginx何时完成正常关闭?

    &&touchrestarted),因为即使Nginx没有完成其关闭,touch命令也会立即执行.有没有好办法呢?这样的事情怎么样?因此,pgrep将查找任何Nginx进程,而while循环将让它坐在那里直到它们全部消失.你可以改变一些有用的东西,比如睡1;/etc/init.d/Nginx停止,以便它会休眠一秒钟,然后尝试使用init.d脚本停止Nginx.你也可以在某处放置一个计数器,这样你就可以在需要太长时间时发出轰击信号.

  6. ubuntu – 如何将所有外发电子邮件从postfix重定向到单个地址进行测试

    我正在为基于Web的应用程序设置测试服务器,该应用程序发送一些电子邮件通知.有时候测试是使用真实的客户数据进行的,因此我需要保证服务器在我们测试时无法向真实客户发送电子邮件.我想要的是配置postfix,以便它接收任何外发电子邮件并将其重定向到一个电子邮件地址,而不是传递到真正的目的地.我正在运行ubuntu服务器9.10.先感谢您设置本地用户以接收所有被困邮件:你需要在main.cf中添加:然后

  7. ubuntu – vagrant无法连接到虚拟框

    当我使用基本的Vagrantfile,只配置了两条线:我看到我的虚拟框打开,但是我的流氓日志多次显示此行直到超时:然后,超时后的一段时间,虚拟框框终于要求我登录,但是太久了!所以我用流氓/流氓记录.然后在我的物理机器上,如果我“流氓ssh”.没有事情发生,直到:怎么了?

  8. ubuntu – Nginx – 转发HTTP AUTH – 用户?

    我和Nginx和Jenkins有些麻烦.我尝试使用Nginx作为Jenkins实例的反向代理,使用HTTP基本身份验证.它到目前为止工作,但我不知道如何传递带有AUTH用户名的标头?}尝试将此指令添加到您的位置块

  9. Debian / Ubuntu – 删除后如何恢复/ var / cache / apt结构?

    我在ubuntu服务器上的空间不足,所以我做了这个命令以节省空间但是现在在尝试使用apt时,我会收到以下错误:等等显然我删除了一些目录结构.有没有办法做apt-getrebuild-var-tree或类似的?

  10. 检查ubuntu上安装的rubygems版本?

    如何查看我的ubuntu盒子上安装的rubygems版本?只是一个想法,列出已安装的软件包和grep为ruby或宝石或其他:)dpkg–get-selections

返回
顶部