Флаг -openmp на ifort делает больше, чем просто включает обработку директивы 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).