如何用Qt Creator编译一个简单的OpenCL应用程序?

Hel*_*bye 5 intel opencl permission-denied qt-creator windows-7-x64

我正在尝试使用Qt Creator,在Windows 7 64位和英特尔SDK for OpenCL Applications 2013上编译以下C++代码:

#include <utility>
#define __NO_STD_VECTOR // Use cl::vector instead of STL version
#include <CL/cl.hpp>

int main()
{
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是我的.pro文件:

TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt

SOURCES += main.cpp

win32:CONFIG(release, debug|release): LIBS += -L$$PWD/C:/Program1/Intel/OpenCL_SDK/3.0/lib/x64/ -lOpenCL
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/C:/Program1/Intel/OpenCL_SDK/3.0/lib/x64/ -lOpenCLd
else:unix: LIBS += -L$$PWD/C:/Program1/Intel/OpenCL_SDK/3.0/lib/x64/ -lOpenCL

INCLUDEPATH += C:/Program1/Intel/OpenCL_SDK/3.0/include
DEPENDPATH += $$PWD/C:/Program1/Intel/OpenCL_SDK/3.0/include
Run Code Online (Sandbox Code Playgroud)

我不得不删除$$PWD/(由于某些未知原因将Qt Creator添加到每个路径的开头)INCLUDEPATH,否则编译器将找不到CL/cl.cpp.

无论如何,在尝试编译时,我收到以下错误消息:

In file included from ..\opencl_test\main.cpp:3:0:
C:\Program1\Intel\OpenCL_SDK\3.0\include/CL/cl.hpp:680:1: error: expected unqualified-id before '{' token
 {
 ^
Run Code Online (Sandbox Code Playgroud)

接下来是很多其他错误消息.为什么我会收到这些错误,如何解决?


更新1

正如prajmus在评论中指出的那样,$$PWD是.pro文件的目录,因此在它之后缺少一个空格,Qt Creator错过了它.在LIBS规范中,-L也必须在之前添加C:.

我修复了,但我仍然得到相同的错误消息.


更新2

如果我注释掉该行#define __NO_STD_VECTOR,错误消息就会消失,但我得到了

c:/program1/qt/tools/mingw48_32/bin/../lib/gcc/i686-w64-mingw32/4.8.0/../../../../i686-w64-mingw32/bin/ld.exe: cannot find -lOpenCLd
Run Code Online (Sandbox Code Playgroud)

改变-lOpenCLd-lOpenCL摆脱这一警告的,而是给了我

00:38:14: Running steps for project opencl_test...
00:38:14: Configuration unchanged, skipping qmake step.
00:38:14: Starting: "C:\Program1\Qt\Tools\mingw48_32\bin\mingw32-make.exe" 
C:\Program1\Qt\5.2.0\mingw48_32\bin\qmake.exe -spec win32-g++ CONFIG+=debug CONFIG+=declarative_debug CONFIG+=qml_debug -o Makefile ..\opencl_test\opencl_test.pro
C:/Program1/Qt/Tools/mingw48_32/bin/mingw32-make -f Makefile.Debug
mingw32-make[1]: Entering directory 'E:/Work/Programs/Test_programs/opencl_test/build-opencl_test-Desktop_Qt_5_2_0_MinGW_32bit-Debug'
g++ -Wl,-subsystem,console -mthreads -o debug\opencl_test.exe debug/main.o  -LE:/Work/Programs/Test_programs/opencl_test/opencl_test/ -LC:/Program1/Intel/OpenCL_SDK/3.0/lib/x64/ -lOpenCL
debug/main.o: In function `getPlatformVersion':
C:/Program1/Intel/OpenCL_SDK/3.0/include/CL/cl.hpp:1689: undefined reference to `clGetPlatformInfo@20'
Run Code Online (Sandbox Code Playgroud)

**现在,为什么说``clGetPlatformInfo @ is undefined?** In [this question][1], the answer seems to be that20'- comes before the source file. But in my case,ltOpenCL -lOpenCL`是构建线的最后一个参数.另一方面,我看不到main.cpp是在任何地方构建的,那么该文件会发生什么?

Hel*_*bye 2

感谢@Matthias,我成功地解决了最后一块难题。所以,总而言之:

  • 32 位 (x86) 版本的 MinGW 无法将您的应用程序链接到 64 位 (x64) 版本的 OpenCL 库。尝试这样做将导致未定义的参考错误。
  • 我必须注释掉该行,#define __NO_STD_VECTOR否则会出现编译错误。
  • 当使用 Qt Creator 中内置的“添加库”功能添加库时,它将放在$$PWD路径之前,并且路径之间不留空格。$$PWD这应该是一个单独的文件夹,因此您指定的路径之间必须有一个空格。对于规范,空格后LIBS还必须有一个额外的空格。-L
  • d如果您没有此类库文件,请确保库名称的后面没有添加。添加我错过取消选中的内部或外部库时,有一个选项“为调试版本添加“d”后缀”。

最终编译出来的代码:

主要.cpp:

#include <utility>
//#define __NO_STD_VECTOR // Use cl::vector instead of STL version
#include <CL/cl.hpp>

int main()
{
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Qt项目文件:

TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt

SOURCES += main.cpp

win32:CONFIG(release, debug|release): LIBS += -L$$PWD/ -LC:/Program1/Intel/OpenCL_SDK/3.0/lib/x86/ -lOpenCL
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/ -LC:/Program1/Intel/OpenCL_SDK/3.0/lib/x86/ -lOpenCL
else:unix: LIBS += -L$$PWD/ -LC:/Program1/Intel/OpenCL_SDK/3.0/lib/x86/ -lOpenCL

INCLUDEPATH += $$PWD/ C:/Program1/Intel/OpenCL_SDK/3.0/include
DEPENDPATH += $$PWD/ C:/Program1/Intel/OpenCL_SDK/3.0/include
Run Code Online (Sandbox Code Playgroud)