首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt插件与OpenMP支持的MinGW:未定义的引用?

Qt插件与OpenMP支持的MinGW:未定义的引用?
EN

Stack Overflow用户
提问于 2011-01-27 08:20:53
回答 1查看 1.9K关注 0票数 4

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

代码语言:javascript
复制
#ifdef OPENMP_ENABLE
#pragma omp parallel for
#endif  for(int i=0; i<volumeData->getZSize(); i++){  .

我在OpenMP文件中启用了以下CMake:

代码语言:javascript
复制
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配置为:

代码语言:javascript
复制
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:警告:在命令行中未指定启用自动导入的情况下,自动导入已被激活.除非涉及从自动导入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: In 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退出状态make2:* dist/plugins/libRinzoDLPluginIPThreshold.dll错误1

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

有小费吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-27 09:37:57

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

代码语言:javascript
复制
set_target_properties(<target_name> LINK_FLAGS "${OpenMP_CXX_FLAGS}")

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

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

代码语言:javascript
复制
#if defined(_OPENMP)
// use openmp
#endif
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4814074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档