混合 C、C++ 和 Fortran 中的代码

Mixing code in C, C++, and Fortran

本文关键字:代码 Fortran C++ 混合      更新时间:2023-10-16

我一直在尝试混合C,C++和Fortran中的代码。 我有一个简单的测试涉及C++(cppprogram.C)中的主程序:

#include <iostream>
using namespace std;
extern "C" {
  void ffunction_(float *a, float *b);
}
extern "C" {
  void cfunction(float *a, float *b);
}
void cppfunction(float *a, float *b);
int main() {
  float a=1.0, b=2.0;
  cout << "Before running Fortran function:" << endl;
  cout << "a=" << a << endl;
  cout << "b=" << b << endl;
  ffunction_(&a,&b);
  cout << "After running Fortran function:" << endl;
  cout << "a=" << a << endl;
  cout << "b=" << b << endl;
  cout << "Before running C function:" << endl;
  cout << "a=" << a << endl;
  cout << "b=" << b << endl;
  cfunction(&a,&b);
  cout << "After running C function:" << endl;
  cout << "a=" << a << endl;
  cout << "b=" << b << endl;
  cout << "Before running C++ function:" << endl;
  cout << "a=" << a << endl;
  cout << "b=" << b << endl;
  cppfunction(&a,&b);
  cout << "After running C++ function:" << endl;
  cout << "a=" << a << endl;
  cout << "b=" << b << endl;
  return 0;
}

。C、C++ 和 Fortran 中的调用过程:

C ( cfunction1.c

void cfunction(float *a, float *b) {
  *a=7.0;
  *b=8.0;
}

C++ ( cppfunction1.C

extern "C" {
  void cppfunction(float *a, float *b);
}
void cppfunction(float *a, float *b) {
  *a=5.0;
  *b=6.0;
}

福特兰 ( ffunction.f

subroutine ffunction(a,b)
a=3.0
b=4.0
end

以下是我用来制作目标文件并将它们链接在一起的命令:

g++ -c cppprogram.C
gcc -c cfunction1.c
g++ -c cppfunction1.C
gfortran -c ffunction.f
g++ -o cppprogram cppprogram.o cfunction1.o cppfunction1.o ffunction.o

这是我的错误:

cppprogram.o: In function `main':
cppprogram.C:(.text+0x339): undefined reference to `cppfunction(float*, float*)'
collect2: error: ld returned 1 exit status

我知道编译器有时希望在文件名后附加下划线,但我认为我已经处理好了。 这可以通过nm命令确定。 某处有一个小错误...有人看到吗? 提前非常感谢。

更新

你在cppfunction1.C中将cppfunction声明为extern "C",但在cppprogram.C中你没有将其声明为extern "C"。由于mainC++因此,除非您希望能够从 C 或 Fortran 调用它,否则无需在 cppfunction1.C 中将cppfunction声明为 extern "C"

cppfunction1.C 中删除extern "C"