2011-02-11 53 views
3

我有一个C++例程standalone_c.cpp和一个用于包装standalone_c.cpp的fortran standalone_f.f90中的包装器。 standalone_c.cpp是使用openmp编译指示的多线程。我能够编译standalone_c.cpp和wrapper standalone_f.f90。但是,当我试图链接这两个时,我遇到了像omp_get_thread_num的未定义引用,omp_get_num_procs的未定义引用等错误。有没有人有从Fortran例程调用多线程C或C++代码的经验?有谁能猜到为什么会发生这种情况?从Fortran例程调用多线程(openmp)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

用于编译和链接的命令将有助于查看。 – suszterpatt 2011-02-11 17:55:45

+0

哎呀,意思是包括那些 – Anu 2011-02-11 17:59:58

回答

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)兼容,使用C++运行 - 链接时间库由g ++(-cxxlib)提供。

+0

谢谢!真的很清楚答案,我错过了-openmp-lib compat标志。 – Anu 2011-02-14 19:14:37

0

对于GNU编译器,启用OpenMP的命令行选项是-fopenmp,而不是您的示例中的-openmp。其次,使用-fopenmp选项时,编译器会生成对GNU OpenMP支持库(libgomp)的调用。当你使用ifort而不是gfortran进行最后的链接时,你需要明确链接到该库。

即使如此,case -fopenmp可能会在主程序中添加一些设置调用。首先,我会检查是否可以使用GNU Fortran编译器(gfortran)而不是ifort来运行程序。请记住,即使Fortran代码本身不使用OpenMP,也要将-fopenmp添加到gfortran标志中。