混合C++;和Fortran连接问题 我在网上搜索过一些,但是我无法找到如何从Linux编译简单的C++和FORTRAN代码。我需要把它复杂化,但我只需要知道如何从一个简单的例子开始 我使用 iFort < /Cord >编译我的fortran代码和g++用于C++代码。我已尝试此终端命令: $ ifort -c Program.f90 $ g++ -o Main.cpp Program.o
但我得到的错误是“链接器输入文件未使用,因为链接未完成。” 我不知道如何将两者联系起来。如果有人能帮我,我将不胜感激混合C++;和Fortran连接问题 我在网上搜索过一些,但是我无法找到如何从Linux编译简单的C++和FORTRAN代码。我需要把它复杂化,但我只需要知道如何从一个简单的例子开始 我使用 iFort < /Cord >编译我的fortran代码和g++用于C++代码。我已尝试此终端命令: $ ifort -c Program.f90 $ g++ -o Main.cpp Program.o,c++,linker,fortran,intel-fortran,fortran-iso-c-binding,C++,Linker,Fortran,Intel Fortran,Fortran Iso C Binding,但我得到的错误是“链接器输入文件未使用,因为链接未完成。” 我不知道如何将两者联系起来。如果有人能帮我,我将不胜感激 PS-我曾尝试在编译行的末尾添加-lg2c,但它没有被识别。这里很少有对象名称不匹配的问题。首先,在C++代码中指定外部函数具有C签名: 在test.cpp中: extern "C" int Add( int *, int * ); extern "C" int Multiply( int *, int * ); 有关更多详细信息,请参阅 在Fortran代码中,通过在模块中放
PS-我曾尝试在编译行的末尾添加
-lg2c
,但它没有被识别。这里很少有对象名称不匹配的问题。首先,在C++代码中指定外部函数具有C签名:
在test.cpp中:
extern "C" int Add( int *, int * );
extern "C" int Multiply( int *, int * );
有关更多详细信息,请参阅
在Fortran代码中,通过在模块中放置过程使接口显式,并使用iso_c_binding
使Fortran对象显示为有效的c对象。请注意,我们可以通过C代码或C++程序通过“代码< B/<代码>关键字:
测试f.f90:
module mymod
use iso_c_binding
implicit none
contains
integer(kind=c_int) function Add(a,b) bind(c,name='Add')
integer(kind=c_int) :: a,b
Add = a+b
end function
integer(kind=c_int) function Multiply(a,b) bind(c,name='Multiply')
integer(kind=c_int) :: a,b
Multiply = a*b
end function
endmodule mymod
编译(不介意我使用英特尔套件,我的g++&gfortran非常旧):
链接:
执行
a.out
现在应该可以按预期工作。您g++
似乎是错误的,应该是'g++-o Program.o Main。cpp@ZacWrangler它不应该,因为C++程序.O会覆盖以前构建的FORTRAN程序。相反,要有不同的对象文件名。请注意,use iso_c_binding
语句对于显示的代码是多余的-没有从该模块访问任何实体。@IanH-Ah我没有意识到这一点。我编辑代码以删除冗余:)。这比处理那些疯狂的无下划线编译器标志要好得多!
$ ifort -c test_f.f90
$ icpc -c test.cpp
$ icpc test_f.o test.o