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

5

我正试图在Windows 7 64位操作系统上,使用Intel OpenCL应用程序SDK 2013和Qt Creator编译以下C++代码:

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

int main()
{
    return 0;
}

这是我的.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

我不得不移除$$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
 {
 ^

紧接着是许多其他错误消息。我为什么会收到这些错误消息,如何解决?


更新1

正如prajmus在评论中指出的那样,$$PWD是.pro文件的目录,因此缺少一个空格,而Qt Creator忽略了它。在LIBS规范中,还需要在C:之前添加-L

我已经修复了这个问题,但我仍然收到相同的错误消息。


更新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

-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'

现在,为什么会显示“clGetPlatformInfo@20未定义”? 在[这个问题][1]中,答案似乎是-lOpenCL在源文件之前。但在我的情况下,-lOpenCL是构建行的最后一个参数。另一方面,我看不到main.cpp被构建在任何地方,那么这个文件会发生什么呢?


OpenCLd 是带有调试符号的库(因此末尾有 d),$$PWD 是您的 .pro 文件目录(因此大多数情况下是您的项目目录)。您在 $$PWD/ 后面缺少一个空格,也许之前由于这个原因它没有起作用。 - prajmus
@prajmus:啊!是的,这很有道理,但奇怪的是Qt Creator生成的代码不起作用。我将$$PWD/重新添加到.pro文件中,并在每个位置后面添加了一个空格,现在它可以找到cl.hpp了。然而,我仍然收到相同的错误消息。 - HelloGoodbye
1
你正在使用64位Windows,带有64位SDK和32位MinGW?那么这个答案可能对你有帮助:https://dev59.com/BWjWa4cB1Zd3GeqPq3zm#12438831 - Matthias Holzapfel
@Matthias:是的,如果你想使用MinGW编译器,Windows上只有32位版本的Qt 5.2可用。我不知道为什么。所以,32位版本的MinGW只能链接到32位库?(我猜它也只能编译32位程序)为什么?所以,如果你想编译32位版本和64位版本的应用程序,你需要同时拥有32位版本和64位版本的编译器和所有你想链接的库的32位和64位版本。 - HelloGoodbye
1
除非进行交叉编译,否则编译器将使用其自己的架构。请参见此处:https://dev59.com/MW035IYBdhLWcg3wGMLa - Matthias Holzapfel
显示剩余3条评论
1个回答

2
感谢@Matthias,我成功地把最后一块拼图放进去了。所以,总结如下:
  • MinGW的32位(x86)版本不能将你的应用程序与OpenCL库的64位(x64)版本链接在一起,这样做会产生未定义的引用错误。
  • 我必须注释掉#define __NO_STD_VECTOR这一行,否则会出现编译错误。
  • 在Qt Creator内置的“添加库”功能中添加库时,它会在路径前面加上$$PWD,并且不会在它们之间加上空格。这应该是一个单独的文件夹,所以$$PWD和您指定的路径之间必须有一个空格。对于LIBS规范,在空格后还必须有一个额外的-L
  • 如果不存在此类库文件,则确保在库名称结尾处没有添加d。在添加内部或外部库时,有一个选项“为调试版本添加“d”后缀”,我错过了取消勾选。

最终编译的代码:

main.cpp:

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

int main()
{
    return 0;
}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接