Fortran和C++的混合编程:Fortran不能调用C++子程序

Hac*_*ata 4 c++ fortran

最近,我正在做一个项目,其中一些 C++ 子例程被 Fortran 脚本调用(Fortran 求解器打算具有一些数据后处理功能,该功能来自用 C++ 开发的库)。以下过程重播错误产生过程。在这里,我使用非常简单的 Fortran 和 C++ 脚本进行简单明了的演示。

一个简单的 Fortran 主程序调用 CXX 子程序: CXX 子程序 - sub1.cxx:

    #include <stdio.h>
    using namespace :: std;
    extern "C" void func_c_();
    void func_c_()
    {
         printf("%d\n", 100);
    }
Run Code Online (Sandbox Code Playgroud)

Fortran 主程序 - sub2.f90:

    program func_fortran
          implicit none
          call func_c()
    end program func_fortran
Run Code Online (Sandbox Code Playgroud)

编译它们:

    g++ -c sub1.cxx
    gfortran -o test sub2.f90 sub1.o
Run Code Online (Sandbox Code Playgroud)

我们得到可执行文件 - 测试。到目前为止,没有问题。

然后我们将 sub1.cxx 替换为 sub1.1.cxx。看起来像:

    #include <iostream>
    using namespace :: std; 
    extern "C" void func_c_();
    void func_c_()
    {
         cout << "I am a CXX." << endl;
    }
Run Code Online (Sandbox Code Playgroud)

Fortran 主程序与前一个完全相同。我们没有碰它。

现在我们编译代码:

    g++ -c sub1.1.cxx
    gfortran -o test sub2.f90 sub1.1.o
Run Code Online (Sandbox Code Playgroud)

我们可以获得sub1.1.o。但是错误消息被抛出:

    sub1.1.o: In function `func_c_':
    sub1.1.cxx:(.text+0xa): undefined reference to `std::cout'
    sub1.1.cxx:(.text+0xf): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
    sub1.1.cxx:(.text+0x14): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)'
    sub1.1.cxx:(.text+0x1c): undefined reference to `std::ostream::operator<<(std::ostream& (*)(std::ostream&))'
    sub1.1.o: In function `__static_initialization_and_destruction_0(int, int)':
    sub1.1.cxx:(.text+0x46): undefined reference to `std::ios_base::Init::Init()'
    sub1.1.cxx:(.text+0x55): undefined reference to `std::ios_base::Init::~Init()'
    collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

与 sub1.cxx 相比,sub1.1.cxx 中的某些 C++ 标准如 std::cout 似乎无法识别。任何人都可以解决这个问题?此外,在这里我没有使用 Fortran 2013 中的 iso_c_binding。我在其他一些情况下尝试过这个功能,但它也不起作用。

fra*_*sco 7

您需要将可执行文件链接到 C++ 标准库:

g++ -c sub1.1.cxx
gfortran -o test sub2.f90 sub1.1.o -lstdc++
Run Code Online (Sandbox Code Playgroud)

使用 gfortran/g++,您还可以使用 g++ 来链接 fortran 库:

g++ -c sub1.1.cxx
gfortran -c sub2.f90
g++ -o test sub1.o  sub2.o -lgfortran
Run Code Online (Sandbox Code Playgroud)