gpt4 book ai didi

c++ - Fortran和C++混合编程: Fortran can not call C++ subroutines

转载 作者:行者123 更新时间:2023-12-01 23:26:11 24 4
gpt4 key购买 nike

最近,我正在开发一个项目,其中一些 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);
}

Fortran 主程序 - sub2.f90:

    program func_fortran
implicit none
call func_c()
end program func_fortran

编译它们:

    g++ -c sub1.cxx
gfortran -o test sub2.f90 sub1.o

我们得到了可执行文件 - test。目前为止没有任何问题。

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

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

Fortran主程序与上一个完全一样。我们没有碰它。

现在我们编译代码:

    g++ -c sub1.1.cxx
gfortran -o test sub2.f90 sub1.1.o

我们可以获得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

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

最佳答案

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

g++ -c sub1.1.cxx
gfortran -o test sub2.f90 sub1.1.o -lstdc++

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

g++ -c sub1.1.cxx
gfortran -c sub2.f90
g++ -o test sub1.o sub2.o -lgfortran

关于c++ - Fortran和C++混合编程: Fortran can not call C++ subroutines,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59363872/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com