我正在开发一个使用OpenMP的"Qt插件“(可以使用CMake参数启用/禁用OpenMP支持)。我使用MinGW和CMake作为开发环境。我是这样在代码中启用/禁用OpenMP的:
#ifdef OPENMP_ENABLE
#pragma omp parallel for
#endif for(int i=0; i<volumeData->getZSize(); i++){ .我在OpenMP文件中启用了以下CMake:
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:警告:在命令行中未指定启用自动导入的情况下,自动导入已被激活.除非涉及从自动导入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
有小费吗?
发布于 2011-01-27 09:37:57
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
#endifhttps://stackoverflow.com/questions/4814074
复制相似问题