最近,我参与了一个项目,在该项目中,一些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功能。我在其他情况下尝试过这个功能,但也没有起作用。