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

时间:2018-05-21 15:10:34

标签: android c gcc opencl

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

我想在三星Galaxy S7(Exynos SoC)上“运行”/执行包含OpenCL功能的程序。对OpenCL的支持应该不是问题,因为: 1)这是一个来自知名制造商的良好支持的旗舰手机 2)libOpenCL.so中存在/system/vendor/lib/libOpenCL.so 3)OpenCL-Z报告有效的平台和设备(仅出于某种原因的GPU)

我尝试过的事情: 根植了手机。 安装了cppdroid。 试图编译一个包含对clGetPlatformIDs()等标准OpenCL函数的引用的简单程序。

头文件应该包含在某个地方,但我不能在我的生活中找到放置它们的位置(使用相同的路径,其中cppdroid存储标准头文件不起作用),所以我手动将头文件包含在.c中归档自己,使其在手机上几乎无法编辑。

我的理解是我应该在链接阶段将库(libOpenCL.so)链接到gcc的输出。似乎在cppdroid中有一个选项,在“设置”“项目设置”“链接选项”下,我添加:

-L/system/vendor/lib/libOpenCL.so

到那个领域。然而,编译仍然失败,我得到“对clGetPlatformIDs()的未定义引用”,好像我根本没有包含库。

在线搜索解决方案后,可能的补救措施(见下文)证明无用:     -Wl, - whole-archive -L / system / vendor / lib / libOpenCL.so

我以为我会自己获得gcc,因为这是cppdroid使用的编译器并尝试以这种方式编译。发现它应该被弃用,并被“clang”取代。但是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

错误消息?

3 个答案:

答案 0 :(得分:0)

  

我的理解是我应该在链接阶段将库(libOpenCL.so)链接到gcc的输出。似乎有一个选项可以在cppdroid中执行,在"设置" "项目设置" "链接选项"所以我补充说:

     

fetch('http://localhost:8888/api/buildings') .then(response => response.json()) .then(data => { userCoordinates = { latitude: 35.7053509, longitude: 16.9362301 } const returnedBuilding = Object.entries(data.data).map(([inst, key]) => key) .filter(thing => (thing.latitude > userCoordinates.latitude - .5 && thing.latitude < userCoordinates.latitude + .5) && (thing.longitude > userCoordinates.longitude -.5 && thing.longitude < userCoordinates.longitude + .5)); console.log(returnedBuilding); })

     

到那个领域。但是编译仍然失败,我得到了对clGetPlatformIDs()&#34;的未定义引用。好像我根本没有包括图书馆。

您需要将-L/system/vendor/lib/libOpenCL.so-lOpenCL添加到链接器标志。第二个选项可能不是必需的,因为此目录应该已经在默认搜索路径中。

答案 1 :(得分:0)

首先-L为要链接的库提供搜索目录,您应该使用-L/system/vendor/lib,您可以使用-l链接到您的案例-lOpenCL中的库,而无需lib前缀。

答案 2 :(得分:0)

我在我的三星 S9+ Exynos 手机上使用了它。以下是我在 Termux 应用中安装 OpenCL 的操作:

apt update
apt upgrade
apt autoremove
apt install vim g++ git cmake make
exit
# restart Termux
cd ~
mkdir opencl
cd ~/opencl
git clone https://github.com/KhronosGroup/OpenCL-Headers
cd ~/opencl/OpenCL-Headers
cmake -S . -B build -DCMAKE_INSTALL_PREFIX=$PREFIX
cmake --build build --target install
cd ~/opencl
git clone https://github.com/Oblomov/clinfo
cd ~/opencl/clinfo
make OS=Android
./clinfo
cd ~
vim ~/.bashrc
# press the i key, then paste the line below, then save and exit with :wq
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/system/vendor/lib64:/system/vendor/lib64/egl

最后,编译带有头文件的 C++ OpenCL 程序here

cd Test/src
g++ *.cpp -o Test.exe -std=c++11 -pthread -w -I./OpenCL/include -L/system/vendor/lib64 -lOpenCL
./Test.exe