我今天花了很多时间试图完成这个看似非常简单的任务,所以我的挫折感对你来说可能很奇怪。
我想在三星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
错误消息?
答案 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