2014-01-16 38 views
0

我想在OpenCL for ARM GPU - Mali中构建我的程序。尚未解决的符号的另一个链接问题

我有一个图书馆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和object文件的原始条目未被损坏。 尝试使用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

你可以发布实际的代码(也许只是一个简单的例子,只是做一个基本的内核,并足够的clCreateKernel调用)。我每天都这样做,每天都这样,所以这可能很简单,但没有看到实际的代码出错,很难说。 –

+0

@MatsPetersson mandelbrot.cpp是来自Mali-SDK的示例代码。我没有改变它 - 我只是现在测试功能。代码的编译阶段已成功传递,唯一的问题是链接 - 由于某些原因,链接器看不到符号。 – user3176112

+0

在链接命令中使用'-Wl, - verbose'(注意:在选项中没有空格)告诉链接器转储有关正在搜索的库的信息,以确保该工具正在查看您期望的文件至。 –

回答

0

如果在nm输出密切关注:

002525b4 t clCreateKernel 

,你会发现,符号标有小写't'这表明该符号具有本地绑定(例如静态函数),因此不考虑绑定到另一个对象文件中的未定义符号。您可以在这里找到大部分隐含的“符号类型”字母的解释:nm这里:https://sourceware.org/binutils/docs/binutils/nm.html

readelf实用程序的输出更清楚符号类型。

也许库的构建不正确?

+0

哇,你是对的!我实际上并不知道小写的't'代表本地符号,只知道它暗示了文本/代码部分。 'arm-v7a15v4r3-linux-gnueabi-readelf'的输出给出了诸如'106586:002525b5 66 FUNC LOCAL DEFAULT 11 clCreateKernel' – user3176112

+0

@ user3176112这样的行:那么你知道它们为什么被标记为本地吗?我对Mali(或OpenCL)并不熟悉,但它看起来像是在Google上弹出的那个'clCreateKernel()'旨在从用户代码中调用的东西。 –

+0

实际上不知道。但我会联系实际从源代码构建它的开发人员。我想这只是他们身上的一个愚蠢的错误。当然,这些符号应该是可以访问的,这就是拥有一个图书馆的关键。 – user3176112