我可以使用gcc分别使用g ++或gfortran在c和c ++之间或c和fortran之间进行调用.但是如果我尝试在c ++和fortran之间进行过程调用,那么在使用g ++或gfortran编译时会出现错误,因为它们都不知道其他所需的库.如何链接使用c ++和fortran编写的源代码的项目?
$ cat print_hi.f90
subroutine print_hi() bind(C)
implicit none
write(*,*) "Hello from Fortran."
end subroutine print_hi
$ cat main.cpp
#include <iostream>
extern "C" void print_hi(void);
using namespace std;
int main() {
print_hi();
cout << "Hello from C++" << endl;
return 0;
}
$ gfortran -c print_hi.f90 -o print_hi.o
$ g++ -c main.cpp -o main.o
Run Code Online (Sandbox Code Playgroud)
我尝试用g ++链接:
$ g++ main.o print_hi.o -o main
print_hi.o: In function `print_hi':
print_hi.f90:(.text+0x3f): undefined reference to `_gfortran_st_write'
Run Code Online (Sandbox Code Playgroud)
以及有关未定义引用的更多错误.
并与gfortran:
$ gfortran …Run Code Online (Sandbox Code Playgroud) 最近,我正在做一个项目,其中一些 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 …Run Code Online (Sandbox Code Playgroud)