使用 LDFLAGS 用 fortran openmp 编译 oct 文件

Compile oct file with fortran openmp using LDFLAGS

使用 ubuntu 14.04 八度 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 来解决,但是,由于某种原因我失败了。

我在八度终端中设置了环境变量 setenv("LDFLAGS","-Wl,-B符号函数,-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/'

我是否正确使用了标志?我还应该怎么做才能获得正确的编译?

问题已解决: 似乎连续应用以下命令可以解决问题:

setenv("FFLAGS","-g -O2 -fstack-protector --param=ssp-buffer-size=4 -fopenmp")
setenv("LDFLAGS","-Wl,-Bsymbolic-functions, -Wl,-z,relro, -Wl,-fopenmp")
mkoctfile ce5.cpp fort5.o  '-L, /usr/lib/x86_64-linux-gnu/libgomp.so.1'

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