2012-03-29 69 views
4

我正在创建一个命令行C++测试应用程序(可执行文件),以在我的rooted android设备上运行。未定义的引用错误 - rand

可执行文件使用多个预构建的C库,其中一个使用'rand()'。在链接状态期间,我得到错误“未定义的参考'rand'

要检查路径设置是否正确,我尝试了下面的方法,但没有成功。

第一种方法:我在我的测试源中定义了rand()。

我注意到,我得到多发定义错误,第一个定义仿生为/ libc中/有/ stdlib.h中

方法二:使用兰特()在我的测试应用

通知我链接器不会抱怨这里未定义的符号

第三条道路:解除封存和归档所有的目标文件

发现我仍然收到未定义的引用错误。

当使用'rand'的C库被编译成使用C测试文件的可执行文件时,看不到所提到的链接器错误。

我无法修改预建的静态库,需要使用我的基于C++的测试应用程序库。

任何投入将非常受欢迎。

+0

这听起来像库希望rand返回'int rand'而不是'unsigned int rand'。如果它是静态链接的,为什么要使用'hack'并编译/链接一个测试C文件? – 2012-03-29 14:00:18

+0

rand是一个标准的C模块,并在创建共享对象或可执行文件时进行链接。提供给我的静态库使用rand()调用,并没有包含它的定义。 – Deepak 2012-03-30 05:16:15

+0

我会建议寻找一个符号倾销。我知道rand()是什么,我发现你的静态库可能是针对与C库不同的版本编译的。你可以通过很多方式来清除它(提供你自己的rand,为C rand提供一个'wrapper'等等......),但你最好的选择是检查符号转储。我也会指导你http://stackoverflow.com/questions/4768180/rand-implementation – 2012-03-30 07:26:00

回答

1

不够分置评所以...

如果您在仿生的stdlib.h中看看,你会看到兰特()被定义为

静态直列 INT兰特(无效){ ...}

即该函数的实际代码在头文件中。

这就是为什么你的第一种方法会给你一个多重定义的错误。

第二种方法由于相同的原因而成功,并且(因为函数是内联的)在对象文件中不生成'extern'引用以导致搜索任何库。

下一步。您的C++代码将链接到libc或libstdC++(您需要检查)。你的预建静态库显然是针对stdlib.h编译的,它没有内联实现rand()。

您需要在静态上执行LDD(或readelf)命令,并查看您的平台上没有找到它的库。这个库很可能与仿生的名称相同,不会导出rand()符号,因此加载程序无法解析引用。

现在,至于解决这个问题......你至少能够重建静态库,如果不改变它们?你的C测试文件是交叉编译为android还是本地?

0

使用'android-ndk32-r10-windows-x86_64.zip',不'android-ndk64-r10-windows-x86_64.zip'

APP_ABI := armeabi armeabi-v7a x86 

3 API是32位。