使用 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)和库位置的正确指示。
使用 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)和库位置的正确指示。