Eri*_*lan 3 c++ linker fortran makefile
我真的需要你的帮助!我正处于截止日期,我正在努力学习,以完成一些工作.现在已经有一周多了,我正在处理看似简单的问题,但我无法在线成功实施解决方案.
长话短说:我需要从F77调用C++代码.我正在用g ++和gfortran编译.我是一个完整的新手来制作文件.当这些代码被编译为各自程序的一部分时,它们没有错误(我从我的C++代码中获取函数,而不是main(),并尝试将其与fortran代码一起使用).这是我得到的:
C++代码:
#include <cmath>
#include <vector>
using namespace std;
extern"C" double ShtObFun(double x[], int &tp)
{
return //double precision awesomeness
}
Run Code Online (Sandbox Code Playgroud)
Fortran代码:
subroutine objfun(nv, var, f, impass)
implicit real(8) (a-h,o-z), integer (i-n)
c initializations including tp, used below
f = ShtObFun(var, tp)
return
end
Run Code Online (Sandbox Code Playgroud)
Makefile(仅显示上面列出的文件):
all:
g++ -c Objective_Functions.cpp
gfortran -c -O3 opcase1.f
gfortran opcase1.o Objective_Functions.o -fbounds-check -lstdc++ -g -o Program.out
rm *.o
Run Code Online (Sandbox Code Playgroud)
错误:
opcase1.o: In function 'objfun_':
opcase1.f:(.text+0xbd): undefined reference to 'shtobfun_'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我已尝试过各种其他方式,但它们无法正常工作.如果需要,我可以稍后列出.有没有人在这看到这个问题?
我检查过的网站:
从Fortran调用C++函数而不是C, 使用gcc链接fortran和c ++二进制文件,从FORTRAN调用C代码,Cookbook - 从Fortran调用C,YoLinux - 一起使用C/C++和Fortran
编辑(回复第一个答案):
如果我重写C++代码:
#include <cmath>
#include <vector>
using namespace std;
double ShtObFun(double x[], int &tp)
extern"C" double shtobfun_(double *x, int *tp) {
return ShtObFun(x, *tp);
}
{
cout << "reached tp = " << tp << endl;
exit(1);
}
Run Code Online (Sandbox Code Playgroud)
我收到此错误:错误:在'extern'错误之前的预期初始化程序:在'{'标记之前预期的unqualified-id
如果我重写C++代码:
#include <cmath>
#include <vector>
using namespace std;
double ShtObFun(double x[], int &tp);
extern"C" double shtobfun_(double *x, int *tp) {
return ShtObFun(x, *tp);
}
double ShtObFun(double x[], int &tp)
{
cout << "reached tp = " << tp << endl;
exit(1);
}
Run Code Online (Sandbox Code Playgroud)
代码将编译,但我得到的结果是"达到tp = 0",而它应该说"达到tp = 1",因为我在fortran代码中将tp初始化为1(整数tp = 1).如果我只是将函数声明为:我会得到同样的问题:
extern"C" double shtobfun_(double *x, int *tp)
{
//cout, etc
}
Run Code Online (Sandbox Code Playgroud)
声明或别名
extern"C" double ShtObFun(double x[], int &tp)
Run Code Online (Sandbox Code Playgroud)
如
extern"C" double shtobfun_(double x[], int &tp)
Run Code Online (Sandbox Code Playgroud)
见http://gcc.gnu.org/onlinedocs/gcc/Weak-Pragmas.html
那是你迈出的第一步.第二步是认识到Fortran不知道引用,而且它将所有参数作为指针传递.所以你的F77接口应该声明为:
extern"C" double shtobfun_(double x[], int *tp);
Run Code Online (Sandbox Code Playgroud)
把它们放在一起:
double ShtObFun(double x[], int &tp)
extern"C" double shtobfun_(double *x, int *tp) {
return ShtObFun(x, *tp);
}
Run Code Online (Sandbox Code Playgroud)