使用Visual Studio 2013和Intel Fortran编译c++ /C混合代码
Compiling mixed C++/C code with Fortran using Visual Studio 2013 and Intel Fortran
我正试图编译一个简单的c++/Fortran混合程序,但有链接问题。我使用的是Visual Studio 2013 Ultimate和Intel Visual Fortran Compiler XE 14。该程序非常简单,是从网上的某个地方复制的。它有一个c++文件和一个Fortran文件
c++文件是:
// Illustrate passing integer and floating point arrays
// from C++ to Fortran
#include <iostream>
using namespace std;
extern "C"
{
int __stdcall SUMIT(int *, int*);
float __stdcall MEAN(float*, int*);
}
int main()
{
int iA[] = { 3, 5, 6, 7, 2, 3, 4, 5, 11, 7 }, iN = 10, iSum;
float fpA[] = { 1.2f, 3.f, 44.f, 2.5f, -1.3f, 33.44f, 5.f, 0.3f, -3.6f, 24.1f }, fpMean;
iSum = SUMIT(iA, &iN);
cout << "The Sum of iA is:" << iSum << endl;
fpMean = MEAN(fpA, &iN);
cout << "The Mean of fpA is:" << fpMean << endl;
return 0;
}
fortran文件是:
INTEGER FUNCTION SUMIT(IA,N)
INTEGER IA(1)
ISUM=0
DO 50 J=1,N
50 ISUM=ISUM+IA(J)
SUMIT=ISUM
RETURN
END
C
REAL FUNCTION MEAN(RA,N)
REAL RA(1)
SUM=0.
DO 50 J=1,N
50 SUM=SUM+RA(J)
IF(N.GT.0) MEAN=SUM/FLOAT(N)
RETURN
END
为了编译,我创建了一个Fortran库项目,它将Fortran文件编译为静态库,并将另一个c++项目中的c++文件设置为启动项目,并依赖于Fortran库项目。我还在c++项目链接器中包含了生成的fortran库。
编译器/链接器的输出:
1>------ Rebuild All started: Project: Lib1, Configuration: Debug Win32 ------
1>Deleting intermediate files and output files for project 'Lib1', configuration 'Debug|Win32'.
1>Compiling with Intel(R) Visual Fortran Compiler XE 14.0.3.202 [IA-32]...
1>Source1.f
1>Creating library...
1>
1>Build log written to "file://D:workLib1DebugBuildLog.htm"
1>Lib1 - 0 error(s), 0 warning(s)
2>------ Rebuild All started: Project: Test1, Configuration: Debug Win32 ------
2> Source.cpp
2>Source.obj : error LNK2019: unresolved external symbol _SUMIT@8 referenced in function _main
2>Source.obj : error LNK2019: unresolved external symbol _MEAN@8 referenced in function _main
2>D:workLib1DebugTest1.exe : fatal error LNK1120: 2 unresolved externals
========== Rebuild All: 1 succeeded, 1 failed, 0 skipped ==========
有人知道我可能做错了什么吗? 您已经使用stdcall属性在C中声明了函数。没有附加指令或编译选项的Fortran编译器不会使用该调用约定。去掉__stdcall关键字。可能还有其他不同之处。
确保Fortran和C代码可互操作的一个更好的方法是使用Fortran 2003语言的C互操作特性——在这种情况下,您至少可以在Fortran过程声明中应用BIND(C)后缀,通过该后缀的name =说明符提供适当的绑定名称。您还可以采取其他步骤来进一步使接口更加健壮和可移植。在本网站的问题解答中有很多使用fortrans -iso-c-binding标签的例子
相关文章:
- 混合组合和继承的C++问题
- 在混合代码库中将C转换为C++时出现许多包含错误
- D3D11-将混合权重和索引传递到顶点着色器
- C++分数混合比较运算符错误
- 是否可以混合使用SFINAE和模板专业化?
- 如何在 Python C++ 混合库中调试非确定性分段错误?
- 使用 Boost.Spirit 解析具有混合数据类型的 OBJ 文件?
- C++11 中的混合列表初始化
- C++以迭代方式搜索混合类型地图
- #pragma(*诊断)当将Clang分析器与GCC编译器混合时
- 混合 Rcpp 模块和 Rcpp::export
- C++/CLI 混合托管/本机 DLL 不起作用
- 在C++中混合覆盖和重载
- 关于 Direct3D9 中的 alpha 混合的问题
- 使用英特尔内部函数 (AVX) 中的混合说明
- C++ 中混合二进制/文本日志记录的最佳做法
- Fortran 和 C++ 的混合编程:Fortran 不能调用C++子程序
- 错误:在 C++ 目标 c 混合'self'使用未声明的标识符
- 是否有一个版本的glCopyImageSubData在Openg GL中使用混合?
- 为什么这个混合继承程序给出错误的输出?