【问题标题】:Qt Plugin with OpenMP Support on MinGW: Undefined reference?MinGW 上支持 OpenMP 的 Qt 插件:未定义的参考?
【发布时间】:2011-06-16 09:23:05
【问题描述】:

我正在开发一个使用 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]: * [dist/plugins/libRinzoDLPluginIPThreshold.dll] 错误 1

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

有什么建议吗?

【问题讨论】:

  • 完整 CMake 文件的链接需要注册。您可以将其替换为可公开访问的网站吗?

标签: c++ qt mingw cmake openmp


【解决方案1】:

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

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

当然,您需要将&lt;target_name&gt; 替换为您的目标的实际名称。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多