我正在尝试在OpenCL中为ARM GPU构建我的程序 - 马里。
我有一个libMali.so库,其中包含必要的符号:
arm-v7a15v4r3-linux-gnueabi-nm *root_to_lib*/libMali.so
返回
等行 002525b4 t clCreateKernel
以及其他许多具有所有预期OpenCL符号的人。
然而,使用
进行编译 arm-v7a15v4r3-linux-gnueabi-g++ -c -Wall mandelbrot.cpp -o mandelbrot.o
arm-v7a15v4r3-linux-gnueabi-g++ mandelbrot.o -o mandelbrot -L*root_to_lib* -lMali
给了我像
这样的错误 mandelbrot.cpp:(.text+0x2e4): undefined reference to
clCreateKernel'`
以及包含所有符号的其他符号,这些符号实际存在于libMali.so!
中所以,我在链接命令中保持了正确的librabies顺序,库在指定的路径上(确实如此)并且它有符号。
在这种情况下Mangling也不是问题:使用了extern C
说明符,你可以看到lib和目标文件的原始条目都没有被破坏。
尝试使用arm-v7a15v4r3-linux-gnueabi-gcc
完成同样的事情并没有带来任何改变,除了必须手动链接更多的c ++库(使用-L * path * -llib)。
libMali.so是使用arm-v7a15v4r3-linux-gnueabi-g++/gcc/ld
构建的,所以这不是工具链版本的问题。
我已经没想完了。可能有人在这里知道链接过程中更棘手的部分吗?
修改:
实际上,mandelbrot.cpp
是来自Mali-SDK的示例代码。我只是在这个例子中显示我的链接器问题,因为代码中显然没有问题。你可以在这里看到代码:
http://malideveloper.arm.com/downloads/deved/tutorial/SDK/opencl/mandelbrot_8cpp_source.html
http://malideveloper.arm.com/downloads/deved/tutorial/SDK/opencl/mandelbrot_8cl_source.html
答案 0 :(得分:0)
仔细查看nm
输出:
002525b4 t clCreateKernel
您会注意到该符号标有小写't'
,表示该符号具有本地绑定(例如静态函数),因此不会考虑绑定到另一个目标文件中的未定义符号。你可以找到大多数神秘的符号类型的解释" nm
使用的字母:https://sourceware.org/binutils/docs/binutils/nm.html
readelf
实用程序的输出更清楚符号类型。
也许图书馆构建错误了?