最近,我正在做一个项目,其中一些 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。我在其他一些情况下尝试过这个功能,但它也不起作用。
您需要将可执行文件链接到 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)
| 归档时间: |
|
| 查看次数: |
148 次 |
| 最近记录: |