我正在阅读这个 SO 问题:Linking fortran and c++ binaries using gcc。
有人可以解释一下是否可以用 C++ 用 fortran 77 做类似的事情?
我需要从 fortran 77 文件中提取一些子例程并将它们转换为 C++ dll。新创建的 dll 需要使用旧的 fortran 77 文件。
关于如何使用 c++ dll 链接和编译 fortran 77 文件的一些分步说明会很棒。我进行了很多搜索,并且是混合编程的新手。
我正在阅读这个 SO 问题:Linking fortran and c++ binaries using gcc。
有人可以解释一下是否可以用 C++ 用 fortran 77 做类似的事情?
我需要从 fortran 77 文件中提取一些子例程并将它们转换为 C++ dll。新创建的 dll 需要使用旧的 fortran 77 文件。
关于如何使用 c++ dll 链接和编译 fortran 77 文件的一些分步说明会很棒。我进行了很多搜索,并且是混合编程的新手。
这是一个调用 C++ 的 fortran 程序。请注意,接口必须位于外部“C”中,否则链接器将找不到它们。
1) 创建一个名为 worker.cpp 的 C 例程。注意例程名称后面的下划线。
#include <iostream>
extern "C"
{
extern void __attribute__((stdcall)) worker_()
{
std::cout << "Hey it works" << std::endl;
}
}
2) 创建一个名为 boss.for 的 Fortran 程序。请注意,调用 C 例程时没有尾随下划线。
program main
external worker
print *, 'Calling C'
call worker
print *, 'Back to F77'
stop
end
3)编译C代码
g++ -c worker.cpp
4)编译并链接Fortran代码
gfortran boss.for worker.o -o fboss -L/usr/lib -lstdc++
将 C++ 链接到 Fortran 程序几乎是不可能的,因为名称混淆,除非所有内容都位于外部“C”中。或者,您可以使接口 extern "C" 和实现 C++。
这是如何将现有的 Fortran 库与 C++ 程序链接,这是另一篇文章的内容。
1) 创建一个 Fortran 子程序,比如 worker.for。这是 F77 所以记住前 6 个空格
subroutine printhi
print *, 'it works'
end subroutine
2) 创建一个调用它的 C++ 程序,比如 boss.cpp。注意 Fortran 例程名称中的尾随下划线
#include <iostream>
// Avoid any name mangling
extern "C"
{
extern void __attribute__((stdcall)) printhi_(void);
}
int main()
{
std::cout << "Calling fortran" << std::endl;
printhi_();
std::cout << "Returned to C++" << std::endl;
}
3) 构建 F77 例程
gfortran -c worker.for
4) 编译并链接 C++ 程序。添加 fortran 库以解析任何 fortran 特定位。
g++ boss.cpp worker.o -o cboss -L/usr/lib -lgfortran
5) 运行程序
./a.out