已知: 主程序的所有C++源代码
        静态库的所有Fortran源代码
工具: Compiler: MS Visual C++ 2010(x86)
        Compiler: Intel Visual Fortran 2011(x86) ,即IVF 12
        IDE: Microsoft Visual Studio 2010

问题: C++代码中需要调用Fortran子程序,由于Visual Studio已不含Fortran编译器,所以无法混合编译,只有先将Fortran代码编译成静态库,再从C++代码中调用。问题是Fortran子程序可以顺利编译成静态库(.lib文件),但在C++工程中却不能调用,总是提示“无法解析的外部符号 _XXX,该符号在函数 _XX 中被引用”。

刚遇到这个问题时,百度Google一下,发现仅有的一点参考信息来自

http://bbs.sjtu.edu.cn/bbstcon?board=VS&reid=1292155137
    但是,很遗憾,按照这位中国哥哥的提示,还是不行,仍然提示“无法解析的外部符号 _XXX,该符号在函数 _XX 中被引用”。于是继续Google,发现老外专家的回答,硬着头皮看完,OK,问题解决,现总结如下:

1.针对Fortran子程序 Subroutine ffun 的声明,一般都是按照如下格式声明

extern "C" void __stdcall FFUN(int& i);   //FFUN要大写(重要)

然后按照 FFUN(a)使用,这也是彭国伦Fortran95程序设计书中教的方法,这种操作在VC6.0中可以正常使用,但是在VS2010中却不行,在VS2010中声明为__stdcall的话,FFUN会被编译成 FFUN@4 ,而 Fortran 中被编译成FFUN,所以仍然提示“无法解析的外部符号FFUN@4,该符号在函数 _XX 中被引用”,如果声明为__cdecl或直接省略这部分声明的话,就不存在这个问题,所以VS2010中不能再将 Fortran 子程序声明为 __stdcall,而是声明为

extern "C" void FFUN(int *a);

2.Different runtime library specified for C and Fortran project - these must be consistent

You can change the Runtime Library settings in BOTH projects to be "Multithreaded" (not Multithreaded DLL) and it should do what you want.

什么意思?编译Fortran静态库时,要设置工程->属性->c/c++->代码生成->运行库为多线程调试(Debug下),而不是多线程调试DLL。同时,在调用Fortran静态库的C++工程中,也要做同样的设置才行。

3.libifcoremt.lib explicitly listed as an additional dependency in C project - remove
             msvcrt.lib listed as "ignore" in C project - remove

编译时有时会出现“无法打开文件ifconsol.lib ”等一些情况,这时需要添加ivf库路径和附加依赖项解决。有时还会提示库冲突,中国哥哥的解决方法是从项目中排除默认的库,可是如果都做了“运行库为多线程调试”的设置,基本上不会出现这种问题,而且老外明确表示要去掉忽视的库(msvcrt.lib listed as "ignore" in C project - remove)。(In Visual Studio, go to Tools > Options > Projects > VC++ Directories. For "Library Files", add the full path to the Intel Fortran "Lib" folder.)

如此,基本上就解决了。注:本人也是摸索中学习,记录下来仅自己备忘,望大神勿喷。

老外论坛参考:http://software.intel.com/en-us/forums/topic/275962

VS2010 环境下链接 IVF2011 编译的 Fortran 静态库问题相关推荐

  1. 服务器远程连接控制以及在Linux环境下安装go编译环境

    本文主要内容 一.xshell远程控制服务器 二.VS code远程控制服务器 三.在Linux环境下安装go编译环境 初学者在没有人的指导下自己摸索学习真的是太难了,回想一下从大二创新实践开始到现在 ...

  2. 在Linux环境下使用gfortran编译器生成fortran语言的.so共享对象文件 并使用JNA调用 带参方法

    在Linux环境下使用gfortran编译器生成fortran语言的.so共享对象文件 并使用JNA调用 带参方法 1 致谢和参考文章 1.1 致谢 1.2 参考文章 2 环境介绍 3 整体思路 4 ...

  3. LASlib在VS2010平台下的完美编译

    LASlib在VS2010平台下的完美编译 1. 简要介绍 LASlib是进行点云数据读写的理想工具,由北卡计算机学院的Martine isenburg编写.基于该开源库,作者同时开发了LASTool ...

  4. g++ 编译mysql动态库_Linux下g++编译以及使用静态库和动态库的方法详解

    下面小编就为大家带来一篇Linux下g++编译与使用静态库和动态库的方法.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 在windows环境下,我们通常在IDE如VS的 ...

  5. linux编译poco静态库,iOS——为Xcode编译POCO C++静态库

    一.POCO C++ library简介 POCO C++ library是一个C++编写的跨平台库,主要实现网络连接.数据库管理以及服务器,适用于跨平台.嵌入式. 二.为Xcode编译POCO C+ ...

  6. 关于不同版本VS编译获得的静态库、动态库的兼容性

    看了上一篇博客还是在6月13号,一直想着写一些东西,也准备了很多内容,没想到一直拖到了现在.今天终于掀开了我的笔记本盖子,按下了开机按钮,双击浏览器图标打开了博客页(浏览器图标都差点找不到了~~),赶 ...

  7. NDK 编译和使用静态库、动态库

    NDK 编译和使用静态库.动态库 情况一:编译静态库 情况二:编译动态库 情况三:编译动态库+静态库 情况四:已有第三方静态库(动态库),编译静态库(动态库) 默认所有代码和文件在$project/j ...

  8. win7 VS2013 新建工程 编译lua5.1 静态库

    一 lua下载 lua5.1下载地址 :http://download.csdn.net/download/yzf279533105/9960888 二 Windows下: 编译静态库步骤: 1. 从 ...

  9. 编译libmysqlclient.a静态库

    mysql版本:mysql-5.7.17 依次执行: cd /home wget https://sourceforge.net/projects/boost/files/boost/1.59.0/b ...

最新文章

  1. Zabbi监控系统搭建
  2. Atitit.upnp SSDP 查找nas的原理与实现java php c#.net c++
  3. linux命令查看几位,Linux每周几个命令(一)--查找篇
  4. TCP/IP 5.3.5 认证
  5. Oracle内部错误:ORA-07445[kcflfi()+466] [INT_DIVIDE_BY_ZERO]一例
  6. XML读取信息并显示
  7. 安卓 spinner下拉框 做模糊查询_SEO数据查询工具
  8. android Toast五种特效
  9. 输入法候选词排列的两种新方式
  10. Arduino ESP8266利用SPIFFS上传文件和查看文件
  11. 如何用GIS做城市购房选址分析
  12. XPDL学习与分享 二 XPDL整体结构
  13. pandas从excel导入数据,写入数据库
  14. 普通最小二乘法的推导证明
  15. Python turtle绘图(星之卡比)
  16. PS抠章、去水印-你懂得
  17. OpenCV学习笔记(三)——图像像素(图像的最大(小)值、均值、标准差、比较运算、逻辑运算、图像二值化)
  18. 表单元素盘点第二弹<form><textarea>元素详细介绍
  19. kubernetes v1.20项目之二进制扩容多Master
  20. Java、JSP基于WEB的师生互动系统

热门文章

  1. 产品经理相关资源整理
  2. QQ语音测试-微信语音测试-王者荣耀游戏语音测试-社交APP语音质量测试
  3. centos 7 docker镜像加速
  4. 中考计算机考试评分标准,中考分值计算方法是什么 分数怎么算
  5. 数学建模让人收益终身——2022美国大学生数学建模竞赛F奖
  6. 续上文,Unity3D面试ABC
  7. linux安装网卡图解,Linux系统环境下新手如何安装网卡
  8. 适配器改造Servlet并优化
  9. 服务器抓包命令:tcpdump详解
  10. android编程高级教程 pdf,Android多媒体开发高级编程