在MinGW上支持OpenMP的Qt插件:未定义的引用?

时间:2011-01-27 08:20:54

标签: c++ qt mingw cmake openmp

我正在开发一个使用OpenMP的“Qt插件”(可以使用CMake参数启用/禁用OpenMP支持)。我使用MinGW和CMake作为开发环境。 这是我在代码中启用/禁用OpenMP的方法:

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

我在CMake文件中启用了OpenMP,如下所示:

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/thresholdPlgin/ui/dialogthresholdconfig.cpp:221:   未定义的引用   GOMP_parallel_stat' CMakeFiles\RinzoDLPluginIPThreshold.dir\ui\dialogthresholdconfig.cpp.obj:C:/svnosaka3d/trunk/osaka3d/rinzo-platform/src/dlplugins/imageprocplugins/thresholdPlgin/ui/dialogthresholdconfig.cpp:221: undefined reference to GOMP_parallel_end

     

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/src/dlplugins/imageprocplugins/threholdPlugin/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]: *   [测距/插件/ libRinzoDLPluginIPThreshold.dll]   错误1

这是我完整的CMake文件: http://www.keepandshare.com/doc/view.php?id=2552392&da=y

任何提示?

1 个答案:

答案 0 :(得分:4)

OpenMP需要一个运行时库(在gcc的情况下称为libgomp),必须将其链接到创建的可执行文件中。因此,将OpenMP标志添加到编译标志是不够的,还必须将它们添加到链接标志中:

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

当然,您需要将<target_name>替换为目标的实际名称。

顺便说一句,像OPENMP_ENABLE这样的额外定义是多余的。如果启用了OpenMP,则会隐式定义宏_OPENMP以包含受支持的OpenMP版本(更准确地说,是受支持标准的发布日期)。您可以使用此宏在源代码中测试OpenMP支持:

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