Плагин Qt с поддержкой OpenMP на MinGW: неопределенная ссылка? - PullRequest
4 голосов
/ 27 января 2011

Я разрабатываю «Плагин Qt», который использует OpenMP (поддержка OpenMP может быть включена / отключена с помощью параметра CMake).Я использую MinGW и CMake в качестве среды разработки.Вот как я включаю / отключаю OpenMP в коде:

#ifdef OPENMP_ENABLE
#pragma omp parallel for
#endif  for(int i=0; i<volumeData->getZSize(); i++){  .

Я включил OpenMP в файле CMake следующим образом:

OPTION (OPENMP_SUPPORT  "Build with OpenMP parallaization enabled")

IF (OPENMP_SUPPORT)
 FIND_PACKAGE( OpenMP )
 SET(CMAKE_CXX_FLAGS "${OpenMP_CXX_FLAGS}")

 IF ( OpenMP_CXX_FLAGS )
  MESSAGE("------- Adding compiler parameter for OpenMP")
  ADD_DEFINITIONS(-DOPENMP_ENABLE)
 ENDIF()
ENDIF()

и для сборки плагина Qt я настроил CMakeследующим образом:

ADD_DEFINITIONS(-DQT_PLUGIN)

ADD_DEFINITIONS(-DQT_SHARED)

Эта конфигурация прекрасно работает с Linux.В Windows он прекрасно компилируется без поддержки OpenMP.Но при сборке с поддержкой OpenMP выдает ошибку

c: / mingw4 / bin /../ lib / gcc / mingw32 / 4.5.0 /../../../../mingw32/bin/ld.exe: предупреждение: автоматический импорт был активирован без --enable-auto-import, указанного в командной строке.Это должно работать, если в нем не используются постоянные структуры данных, ссылающиеся на символ из автоматически импортируемых DLL.CMakeFiles \ RinzoDLPluginIPThreshold.dir \ ui \ dialogthresholdconfig.cpp.obj: C: /svnosaka3d/trunk/osaka3d/rinzo-platform/src/dlplugins/imageprocplugins/imageprocplugins/thresholdPlgin/ui/dialogepp

CMakeFiles \ RinzoDLPluginIPThreshold.dir \ ui \ dialogthresholdconfig.cpp.obj: в функции ZN21DialogThresholdConfig9slotApplyEv.omp_fn.0': C:/svn/osaka3d/trunk/osaka3d/rinzo-platform/src/dlplugins/imageprocplugins/threholdPlugin/ui/dialogthresholdconfig.cpp:223: undefined reference to omp_get_nu_threads 'C: / svn / osaka3d / trunk / osaka3d / rinzo-platform / thrc / dlproplugin /ui / dialogthresholdconfig.cpp: 223: неопределенная ссылка на omp_get_thead_num' C:/svn/osaka3d/trunk/osaka3d/rinzo-platform/src/dlplugins/imageprocplugins/threholdPlugin/ui/dialogthresholdconfig.cpp:233: undefined reference to omp_get_thead_num 'collect2: ld вернула 1 состояние выхода make [2]: * [dist / plugins / libRinzoDLPluginIPThreshold.dll] Ошибка 1

Вот мой полный файл CMake: http://www.keepandshare.com/doc/view.php?id=2552392&da=y

Любой совет?

1 Ответ

4 голосов
/ 27 января 2011

OpenMP требуется библиотека времени выполнения (называемая libgomp в случае gcc), которая должна быть связана с созданным исполняемым файлом.Поэтому недостаточно добавлять флаги OpenMP к флагам компиляции, они также должны быть добавлены к флагам ссылки:

set_target_properties(<target_name> LINK_FLAGS "${OpenMP_CXX_FLAGS}")

Конечно, вам нужно заменить <target_name> на фактическое имя вашегоtarget.

И, кстати, и дополнительное определение типа OPENMP_ENABLE является излишним.Если OpenMP включен, макрос _OPENMP неявно определяется как содержащий поддерживаемую версию OpenMP (точнее, дату выпуска поддерживаемого стандарта).Вы можете использовать этот макрос для проверки поддержки OpenMP в исходном коде:

#if defined(_OPENMP)
// use openmp
#endif
...