gpt4 book ai didi

c++ - MinGW 上支持 OpenMP 的 Qt 插件 : Undefined reference?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:57:37 26 4
gpt4 key购买 nike

我正在开发一个使用 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: warning:auto-importing has been activated without --enable-auto-import specified on the command line. This should work unless it involves constant data structures referencing symbol from auto-imported DLLs. 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_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 function 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: undefined reference to 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 returned 1 exit status make[2]: * [dist/plugins/libRinzoDLPluginIPThreshold.dll] Error 1

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

有什么建议吗?

最佳答案

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

关于c++ - MinGW 上支持 OpenMP 的 Qt 插件 : Undefined reference?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4814074/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com