使用LDFLAGS使用fortran openmp编译oct文件

时间:2016-01-28 14:10:44

标签: fortran openmp octave

使用ubuntu 14.04 octave 3.8.1。 我正在尝试创建一个使用多线程fortran程序的.oct文件。但是,mkoctfile在链接期间无法使用相关库。

我正在使用的文件如下所示: C:

#include <octave/oct.h>
extern "C" {
void fort5();
}

DEFUN_DLD (ce5, args, ,"help here")
{
fort5();
}

FORTRAN:

subroutine fort5() bind(c)
use iso_c_binding
implicit none
!$OMP PARALLEL
    write(*,*) "Hello"
!$OMP END PARALLEL 
end subroutine fort5

我希望这段代码能够输出四行“Hello”。 我用以下命令编译它     mkoctfile CPP.cpp FORTRAN.f90 结果我只得到一个输出行,表示多重读取被忽略。

使用以下命令在八度音程外编译(对c ++文件稍作修改):

gcc -c CPP.cpp && gfortran -Wall -fimplicit-none -Wtabs -fdefault -real-8 -fopenmp  -c FORTRAN.f90 &&gfortran -fopenmp -o3 CPP.o FORTRAN.o -lstdc++ -o OUT.out

结果是应该的。

从几个测试中可以看出,mkoctfile无法以任何形式使用-fopenmp标志。如找到on the internet这应该可以通过使用LDFLAGS来解决,但是,由于某种原因我失败了。

我用octave终端设置环境变量     setenv(“LDFLAGS”,“ - Wl,-Bsymbolic-functions,-Wl,-z,relro,-fopenmp”)     setenv(“FFLAGS”,“ - g -O2 -fstack-protector --param = ssp-buffer-size = 4 -fopenmp”) $ mkoctfile --print LDFLAGS表示变量已成功设置。但是,编译的函数无法加载:$ undefined symbol:GOMP_parallel_start

我已经尝试明确列出了库,但结果是一样的。

mkoctfile ce5.cpp fort5.o '-Wl,-fopenmp' '-l /usr/lib/x86_64-linux-gnu/libgomp.so.1
mkoctfile ce5.cpp fort5.o '-Wl,-fopenmp' '-L /usr/lib/x86_64-linux-gnu/'

我是否正确使用了旗帜?我还应该做些什么来获得正确的编译?

1 个答案:

答案 0 :(得分:1)

问题解决了: 似乎连续应用以下命令完成了诀窍:

Application.ThreadException += HandleUnhandleException;
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
AppDomain.CurrentDomain.UnhandledException += HandleUnhandleException;

很可能问题是为编译器设置了正确的标志(FFLAGS中的$ -fopenmp)并正确指示库位置。