我有一个c ++例程standalone_c.cpp和fortran standalone_f.f90的包装器,它包装了standalone_c.cpp。 standalone_c.cpp是使用openmp pragma多线程的。我能够编译standalone_c.cpp和包装器standalone_f.f90。但是当我尝试链接这两个时,我得到的错误就像对omp_get_thread_num的未定义引用,对omp_get_num_procs的未定义引用。有没有人有任何从fortran例程调用多线程c或c ++代码的经验?谁能猜到为什么会这样?
如果有足够的兴趣,我可以发布一些伪代码。
编辑:编译命令:
gcc-4.3.3/bin/g++ -O -openmp $(IFLAGS) -c standalone_c.cpp
fce/10.1.015/bin/ifort -g -O0 standalone_f.f90
fce/10.1.015/bin/ifort $(LFLAGS) standalone_c.o standalone_f.o -o standalone
IFLAGS适用于我需要的某些库,LFLAGS是这些库的链接器标志。
答案 0 :(得分:3)
ifort上的-openmp标志不仅仅是打开OpenMP指令处理。它还链接在适当的库中。假设您已经在子例程命名问题中处理了下划线,那么如果将-openmp添加到ifort链接步骤,那将处理OpenMP库并添加-lstdc ++将处理C ++引用(如__gxx_personality_v0)。
或者您可以使用ifort提供的选项。简单的例子:
$> cat a.f90
program a
print *, "calling C++ program"
call b()
end program a
$> cat b.cpp
#include <omp.h>
#include <stdio.h>
extern "C" {
void b_(void); }
void b_(void) {
int i;
#pragma omp parallel for
for (i = 0; i < 10; i++)
printf("t#: %i i: %i\n", omp_get_thread_num(), i);
}
$> g++ -fopenmp -c -o b.o b.cpp
$> ifort -g -O0 -c -o a.o a.f90
$> ifort -openmp -cxxlib -openmp-lib compat b.o a.o
$> export OMP_NUM_THREADS=4
$> a.out
calling C++ program
t#: 2 i: 6
t#: 2 i: 7
t#: 2 i: 8
t#: 3 i: 9
t#: 0 i: 0
t#: 0 i: 1
t#: 0 i: 2
t#: 1 i: 3
t#: 1 i: 4
t#: 1 i: 5
你必须告诉ifort使用OpenMP(-openmp),与GNU OpenMP运行时库libgomp(-openmp-lib compat)兼容,并使用g ++提供的C ++运行时库进行链接( - cxxlib)。
答案 1 :(得分:0)
对于GNU编译器,启用OpenMP的命令行选项是-fopenmp,而不是示例中的-openmp。
其次,当使用-fopenmp选项时,编译器会生成对GNU OpenMP支持库(libgomp)的调用。当您使用ifort而不是gfortran执行最终链接步骤时,您需要显式链接到该库。
即便如此,可能会出现问题--fopenmp会向主程序添加一些设置调用。首先,我会检查是否可以使用GNU Fortran编译器(gfortran)而不是ifort来运行程序。请记住将-fopenmp添加到gfortran标志,即使Fortran代码本身不使用OpenMP。