我正在阅读这个问题:Linking fortran and c++ binaries using gcc。
有人可以解释是否可以用Fortran 77和C ++做类似的事情吗? 我需要从fortran 77文件中提取一些子程序并将它们转换为C ++ dll。新创建的dll需要使用旧的fortran 77文件。
关于如何链接&的一些逐步解释。使用c ++ dll编译fortran 77文件会很棒。我搜索了很多,并且是混合编程的新手。
答案 0 :(得分:0)
将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
答案 1 :(得分:0)
这是一个调用C ++的fortran程序。请注意,接口必须位于extern“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++