我有一个编译时问题,我已经减少到以下测试用例.我希望从fortran调用一个C例程,让C例程知道MPI.

请考虑以下示例代码,

Fortran主要:

! -- main.f90

program main

implicit none

external return_three

integer return_three

write(*,*) return_three()

end program main

C子程序:

// -- subs.cpp

#include

extern "C"

{

int return_three_();

}

int return_three_()

{

return 3;

}

请注意,为了重现问题,我只需要包含mpi.h.

使用GCC 5.3和OpenMPI 1.10.1进行编译(我也检查了GCC 4.8和PGI 15.10)在链接期间出现以下问题:

% mpic++ -c subs.cpp

% mpifort -c main.f90

% mpifort -o main subs.o main.o -lstdc++ -lgcc_s

subs.o: In function `MPI::Intracomm::Intracomm()':

subs.cpp:(.text._ZN3MPI9IntracommC2Ev[_ZN3MPI9IntracommC5Ev]+0x14): undefined reference to `MPI::Comm::Comm()'

subs.o: In function `MPI::Intracomm::Intracomm(ompi_communicator_t*)':

subs.cpp:(.text._ZN3MPI9IntracommC2EP19ompi_communicator_t[_ZN3MPI9IntracommC5EP19ompi_communicator_t]+0x19): undefined reference to `MPI::Comm::Comm()'

subs.o: In function `MPI::Op::Init(void (*)(void const*, void*, int, MPI::Datatype const&), bool)':

subs.cpp:(.text._ZN3MPI2Op4InitEPFvPKvPviRKNS_8DatatypeEEb[_ZN3MPI2Op4InitEPFvPKvPviRKNS_8DatatypeEEb]+0x24): undefined reference to `ompi_mpi_cxx_op_intercept'

subs.o:(.rodata._ZTVN3MPI3WinE[_ZTVN3MPI3WinE]+0x48): undefined reference to `MPI::Win::Free()'

subs.o:(.rodata._ZTVN3MPI8DatatypeE[_ZTVN3MPI8DatatypeE]+0x78): undefined reference to `MPI::Datatype::Free()'

collect2: error: ld returned 1 exit status

在我看来,像mpifort缺少一些C相关的库.据我所知,mpifort应该用于编译fortran主程序.针对OpenMPI 1.10.1编译的Intel 16.0不会出现此问题.

我的问题是:

>这里发生了什么?为什么英特尔能够处理这个示例代码而PGI / GCC不能处理?

>有没有一种可移植的方法在Fortran代码中包含带有MPI的C子程序?

>(如果可能)有一种简单的方法可以解决我目前的问题吗?我正在尝试在我的机器上编译一个包,所以如果我可以添加-lmagicfix或其他东西最好.

解决方法:

通过在最后一步添加-lmpi_cxx,我能够使用GCC 5.3.0和openMPI 1.10.2编译代码:

% mpic++ -c subs.cpp

% mpifort -c main.f90

% mpifort -o main main.o subs.o -lstdc++ -lmpi_cxx

原因是openMPI包装器编译器mpifort和mpic链接到不同的MPI库.您可以使用-showme:libs选项进行检查:

% mpifort -showme:libs

mpi_usempif08 mpi_usempi_ignore_tkr mpi_mpifh mpi

% mpic++ -showme:libs

mpi_cxx mpi

因此,为了使用C MPI库,您必须明确告诉mpifort链接到它.

标签:openmpi,c,gcc,fortran

来源: https://codeday.me/bug/20190824/1706239.html

opencomm在c语言中的作用,使用OpenMPI从Fortran调用C语言相关推荐

  1. 在c语言中调试作用是什么,调试技术在C语言程序设计教学中作用探讨.doc

    调试技术在C语言程序设计教学中作用探讨 调试技术在C语言程序设计教学中作用探讨 摘要:C语言程序设计是计算机相关专业的一门重要课程,但是在实际教学中该课程的教学效果并不能令人满意.本文认为学生没有掌握 ...

  2. c语言浮点变量是什么意思,C语言中说的浮点型是什么意思呢 C语言的浮点数是什么...

    导航:网站首页 > C语言中说的浮点型是什么意思呢 C语言的浮点数是什么 C语言中说的浮点型是什么意思呢 C语言的浮点数是什么 相关问题: 匿名网友: 就是这个数就像有一个飘动的小数点,也就是我 ...

  3. 循环语句在c语言中的作用是什么,C语言中循环语句的使用

    C语言中的循环语句 在C语言中,有三种类型的循环语句: for语句.while语句和do While语句. 分别介绍如下: 1.for循环语句 for语句格式为: for(表达式1;表达式2;表达式3 ...

  4. main在c语言中的作用,main函数在C语言中是怎么定义的?有什么作用?

    main函数在C语言中是怎么定义的?有什么作用? 更新时间:2019-10-24 13:55 最满意答案 额,main不是程序的最开始啦.拿用glibc的程序来说,C语言执行的过程应该是 _start ...

  5. continue在c语言中什么作用,continue在c语言中什么意思?

    continue在c语言中是退出循环的意思,continue语句的作用是跳过循环体中剩余的语句而强行执行下一次循环. continue语句的作用是跳过循环体中剩余的语句而强行执行下一次循环.conti ...

  6. 循环语句在c语言中的作用是什么,C语言循环命令运用

    1.C语言的应用 随着计算机的普及用,越来越多的人感觉到现有的计算机的应用不能满足越来越多.越来越复杂的事物处理,所以希望自己能够根据所遇到不同的情况来设计.制作.开发相对灵活的控制程序.这样既可以满 ...

  7. %6f 在c语言中的作用,最简单的C程序设计 1.实验目的 ①掌握C语言中使用最多的一种语..._考试资料网...

    最简单的C程序设计 1.实验目的 ①掌握C语言中使用最多的一种语句--赋值语句的使用方法. ②掌握各种类型数据的输入输出的方法,能正确使用各种格式转换符. 2.实验内容和步骤 掌握各种格式转换符的正确 ...

  8. EOF指令在C语言中的作用

    首先我们要了解"EOF"指令在C语言中的定义:在C语言中,或更精确地说成C标准函式库中表示文件结束符(end of file).在while循环中以EOF作为文件结束标志,这种以E ...

  9. new在c语言中的作用,C语言中new的用法

    匿名用户 1级 2012-01-26 回答 new是C++中用于动态内存分配的运算符,在C语言中一般使用malloc函数e79fa5e98193e78988e69d8331333337386663. ...

最新文章

  1. 【docker】第五节:docker常用命令总结
  2. OJ1050: 阶乘的累加和(C语言实现多重循环和递推方法)
  3. 苹果cmsV10高仿草民电影网在线影视网站模板 带手机版
  4. Python图像纹理分割
  5. mysql分组取每组前几条记录_[转] mysql分组取每组前几条记要(排名)
  6. 通达信期货接口有必要开通五档行情?
  7. VP9编码:迄今的尝试
  8. java毕业设计彩妆销售网站Mybatis+系统+数据库+调试部署
  9. linux下while循环,Bash 中的 while 循环详解
  10. 火灾自动报警系统下综合布线施工要素
  11. ESXi服务器遇到 IPMI_SI_DRV 的解决, 感谢原作者 以及今天 解决问题.
  12. 嵌入式系统开发笔记0_0:目录
  13. 开年第一炸:黑马程序员1月就业报告新鲜出炉!
  14. 【阅读笔记】Federated Learning for Privacy-Preserving AI
  15. GNN-图卷积模型-2016:PATCHY-SAN【图结构序列化:将图结构转换成了序列结构,然后直接利用卷积神经网络在转化成的序列结构上做卷积】
  16. NLP系列(10)_词向量之图解Word2vec
  17. 智能网联封闭测试场和开放道路测试政策情况全扫描(2022版)
  18. 人工智能与大数据的应用
  19. 系统安全及应用(一)
  20. 2017百度之星资格赛 1003:度度熊与邪恶大魔王

热门文章

  1. can't request region for resource [mem 0xfed40080-0xfed40fff]问题的解决办法
  2. scrapy 模拟登陆
  3. html项目列表页面源码,HTML 列表
  4. 动手学CV-目标检测入门教程3:锚框(anchor)
  5. 基于abtest思想的流量切换(nginx lua redis)
  6. iOS开发ARC入门和使用
  7. JSON特殊字符处理
  8. java中的位移运算符_java中的移位运算符(, , )
  9. java csv下载_java 生成csv文件,弹出下载对话框。。。
  10. python 硬件模拟_如何编写一个硬件模拟器?