使用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/'
我是否正确使用了旗帜?我还应该做些什么来获得正确的编译?
答案 0 :(得分:1)
问题解决了: 似乎连续应用以下命令完成了诀窍:
Application.ThreadException += HandleUnhandleException;
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
AppDomain.CurrentDomain.UnhandledException += HandleUnhandleException;
很可能问题是为编译器设置了正确的标志(FFLAGS中的$ -fopenmp)并正确指示库位置。