Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Android中编译一个简单的OpenCL程序?_Android_C_Gcc_Opencl - Fatal编程技术网

如何在Android中编译一个简单的OpenCL程序?

如何在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

我今天花了很多时间试图完成这项看似非常简单的任务,所以我的挫折感对你来说可能很奇怪

我想在我的三星Galaxy S7(Exynos SoC)上“运行”/“执行”一个包含OpenCL函数的程序。对OpenCL的支持不应成为问题,因为: 1) 这是一款由知名制造商生产的受支持的旗舰手机 2)
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