我正在开发一个使用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_endCMakeFiles \ 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
任何提示?
答案 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