如何在Android中编译一个简单的OpenCL程序?
我今天花了很多时间试图完成这项看似非常简单的任务,所以我的挫折感对你来说可能很奇怪 我想在我的三星Galaxy S7(Exynos SoC)上“运行”/“执行”一个包含OpenCL函数的程序。对OpenCL的支持不应成为问题,因为: 1) 这是一款由知名制造商生产的受支持的旗舰手机 2)如何在Android中编译一个简单的OpenCL程序?,android,c,gcc,opencl,Android,C,Gcc,Opencl,我今天花了很多时间试图完成这项看似非常简单的任务,所以我的挫折感对你来说可能很奇怪 我想在我的三星Galaxy S7(Exynos SoC)上“运行”/“执行”一个包含OpenCL函数的程序。对OpenCL的支持不应成为问题,因为: 1) 这是一款由知名制造商生产的受支持的旗舰手机 2) libOpenCL.so出现在/system/vendor/lib/libOpenCL.so 3) OpenCL-Z报告了一个有效的平台和设备(GPU只是出于某种原因) 我尝试过的事情: 把电话拔了。 已安装c
libOpenCL.so
出现在/system/vendor/lib/libOpenCL.so
3) OpenCL-Z报告了一个有效的平台和设备(GPU只是出于某种原因)
我尝试过的事情:
把电话拔了。
已安装cppdroid。
试图编译一个简单的程序,其中包含对标准OpenCL函数的引用,如clGetPlatformIDs()
头文件应该包含在某个地方,但我一辈子都找不到放置它们的位置(使用cppdroid存储标准头文件的路径不起作用),因此我手动将头文件包含在.c文件中,使其在手机上几乎无法编辑
我的理解是,我应该在链接阶段将库(libOpenCL.so
)链接到gcc的输出。在cppdroid中,在“设置”“项目设置”“链接选项”下似乎有一个选项可以执行此操作,因此我添加:
-L/system/vendor/lib/libOpenCL.so
去那个地方。但是编译仍然失败,我得到了“对clGetPlatformIDs()的未定义引用”,就好像我根本没有包含库一样
在线搜索解决方案后,一种可能的补救方法(见下文)被证明无效:
-Wl,--整个归档文件-L/system/vendor/lib/libOpenCL.so
我想我应该自己获得gcc,因为这是cppdroid使用的编译器,并尝试以这种方式编译。发现它应该被弃用,并被“叮当”取代。但是cppdroid确实包含gcc,所以我导航到包含可执行文件的文件夹(我相信它是一个可执行文件,这里似乎没有扩展,我是一个Windows用户),它似乎是:
/data/data/name.antonsmirnov.android.cppdroid/sdk/gcc#4.8#2/bin
并试图从termux(Android终端仿真器)中“执行”gcc-4.8
(似乎是可执行编译器)。令我大吃一惊的是,我收到了错误信息:
sush: gcc-4.8: not found
即使ls-1
正常列出文件
我尝试了其他各种不起作用的东西,但我的问题是:
如何编译一个用C编写的简单OpenCL程序,以便在我的Android移动设备上执行它?
为什么我会得到
sush: gcc-4.8: not found
错误消息
我的理解是,我应该在链接阶段将库(libOpenCL.so)链接到gcc的输出。在cppdroid中,在“设置”“项目设置”“链接选项”下似乎有一个选项可以执行此操作,因此我添加:
-L/system/vendor/lib/libOpenCL.so
-L/system/vendor/lib/libOpenCL.so
去那个地方。但是编译仍然失败,我得到了“对clGetPlatformIDs()的未定义引用”,就好像我根本没有包含库一样
您需要将
-lOpenCL
和-L/system/vendor/lib
添加到链接器标志中。第二个选项可能不是必需的,因为此目录应该已经在默认搜索路径中。第一个-L
为要链接的库提供搜索目录,您应该使用-L/system/vendor/lib
您可以使用-L
链接到您案例中的库-lOpenCL
,而不使用lib
前缀 我在我的三星S9+Exynos手机上使用了它。以下是我在应用程序中安装OpenCL的步骤:
最后,用C++编写的带有标题的C++ OpenCL程序:
除非您在手机中运行编译器时感到特别愉快,否则在PC上构建可执行文件可能会让您轻松得多。您可以将相关的so文件拉到您的开发机器上(可以使用adb或Android Studio的设备资源管理器)。
cd Test/src
g++ *.cpp -o Test.exe -std=c++11 -pthread -w -I./OpenCL/include -L/system/vendor/lib64 -lOpenCL
./Test.exe