未定义的引用错误 - rand

时间:2012-03-29 13:12:54

标签: android c++ c linker

我正在创建一个命令行C ++测试应用程序(可执行文件),以便在我的root设备上运行。

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

的引用

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

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

我注意到我得到多个定义错误,第一个定义是在bionic / libc / include / stdlib.h

第二种方法:在我的测试应用程序中使用了rand()

我注意到链接器不会在这里抱怨未定义的符号

第三种方法:取消存档并存档所有目标文件

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

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

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

非常欢迎任何意见。

2 个答案:

答案 0 :(得分:1)

没有足够的评论如此......

如果你查看bionic的stdlib.h,你会看到rand()被定义为

静态内嵌 int rand(void){...}

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

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

由于同样的原因,你的第二种方法成功,并且(因为该功能是在线的)不产生外部的'在目标文件中引用以搜索任何库。

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

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

现在,至于解决这个问题......你是否能够至少重建静态库,如果没有改变它们?您的C测试文件是否为Android或本机交叉编译?

答案 1 :(得分:0)

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

APP_ABI := armeabi armeabi-v7a x86

3 api是32位。