将c++与Fortran和未定义的引用链接起来



我正试图在c++和fortran的函数之间传递数组。Fortran代码看起来像:

PROGRAM vector_adder
IMPLICIT NONE
INTEGER,allocatable :: a(:),b(:),c(:)
INTEGER :: i, num
num = 6
allocate(a(num),b(num),c(num))
!C fill vectors with values
DO i = 1,num
a(i) = i*i
b(i) = i
END DO
CALL ADD_VECTORS(a,b,c,num)
WRITE(*,'(I5,I5,I5)') (c(i),i =1,num)
STOP
END PROGRAM

C++代码看起来像:

#include <cmath>
#include <vector>
#include <iostream>
using namespace std;
void add_vectors__(int* a, int* b, int* c, int& num);
extern "C" void add_vectors_(int* a, int* b, int* c, int& num)
{
add_vectors__(a, b, c, num);
}
void add_vectors__(int* a, int* b, int* c, int& num)
{
for (size_t i = 0; i<num; i++)
{
c[i] = a[i] + b[i];
cout <<c[i]<<endl;
}
}

我将代码编译为:

rm -r *.o
rm -r prog
g++ -c c++Code.cpp
gfortran -c fCode.f90
gfortran -o prog fCode.o c++Code.o
./prog

如果我删除c++文件中的法院行,代码就会运行。但是引入cout行给了我以下未定义引用的错误:

c++Code.o: In function `add_vectors__(int*, int*, int*, int&)':
c++Code.cpp:(.text+0xc0): undefined reference to `std::cout'
c++Code.cpp:(.text+0xc5): undefined reference to `std::ostream::operator<<(int)'
c++Code.cpp:(.text+0xcf): 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> >&)'
c++Code.cpp:(.text+0xda): undefined reference to `std::ostream::operator<<(std::ostream& (*)(std::ostream&))'
c++Code.o: In function `__static_initialization_and_destruction_0(int, int)':
c++Code.cpp:(.text+0x110): undefined reference to `std::ios_base::Init::Init()'
c++Code.cpp:(.text+0x125): undefined reference to `std::ios_base::Init::~Init()'
collect2: error: ld returned 1 exit status
./run: line 6: ./prog: No such file or directory

列出的函数来自C++运行库libstdc++。由于您使用gfortran来构建最终库,所以除非您明确告诉gfortran这样做,否则它不会链接到libstdc++

使用g++gfortran链接.o文件是一种方便的简写。真正的链接器是ld;其他命令只是告诉CCD_ 9它们各自的库是什么。

最新更新