7

我在网上做了一些搜索,但我找不到如何从 linux 编译简单的 C++ 和 Fortran 代码。我需要让它变得复杂,但我只需要知道如何从一个简单的例子开始。

我的 C++ 代码是这样的:

#include <iostream>
using namespace std;

extern int Add( int *, int * );
extern int Multiply( int *, int * );

int main()
{
    int a,b,c;  
    cout << "Enter 2 values: ";
    cin >> a >> b;

    c = Add(&a,&b);
    cout << a << " + " << b << " = " << c << endl;
    c = Multiply(&a,&b);
    cout << a << " * " << b << " = " << c << endl;
    return 0;
}

我的 Fortran 代码是这样的:

integer function Add(a,b)
    integer a,b
    Add = a+b
    return
end


integer function Multiply(a,b)
    integer a,b
    Multiply = a*b
    return
end

我正在使用ifort为 C++ 代码编译我的 Fortran 代码和 g++。我试过这个终端命令:

$ ifort -c Program.f90
$ g++ -o Main.cpp Program.o

但是我得到的错误是“链接器输入文件未使用,因为链接未完成”。我不确定如何将两者联系在一起。如果有人可以帮助我,我将不胜感激!

PS - 我尝试-lg2c在编译行末尾添加,但无法识别。

4

1 回答 1

9

这里有几个问题不让对象的名称匹配。首先,在 C++ 代码中指定外部函数具有 C 签名:

在 test.cpp 中:

extern "C" int Add( int *, int * );
extern "C" int Multiply( int *, int * );

请参阅在 C++ 源代码中,extern "C" 的作用是什么?更多细节。

在您的 Fortran 代码中,通过在模块中放置过程来明确接口,并使用iso_c_binding让 Fortran 对象显示为有效的 C 对象。请注意,我们可以显式指定 C 或 C++ 程序将通过bind关键字看到的对象的名称:

test_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 非常旧):

$ ifort -c test_f.f90 
$ icpc -c test.cpp 

关联:

$ icpc test_f.o test.o

执行a.out现在应该按预期工作。

于 2013-10-09T16:15:50.440 回答