未定义的引用错误 – rand
我正在创建一个命令行C ++测试应用程序(可执行文件),在我的root设备上运行。
可执行文件使用多个预构建的C库,其中一个使用’rand()’。 在链接状态期间,我得到错误“ 未定义的’rand’参考 ”
要检查路径是否设置正确,我尝试了以下方法但没有成功。
第一种方法:我在测试源中定义了rand()。
我注意到我得到了多个定义错误,第一个定义是在bionic / libc / include / stdlib.h中
第二种方法:在我的测试应用程序中使用rand()
我注意到链接器不会在这里抱怨未定义的符号
第三种方法:取消归档和归档所有目标文件
发现我仍然得到未定义的引用错误。
当使用’rand’的C库使用C测试文件编译成可执行文件时,看不到所提到的链接器错误。
我无法修改预构建的静态库,需要将库与基于C ++的测试应用程序一起使用。
任何投入都将非常受欢迎。
没有足够的评论如此评论……
如果你查看bionic的stdlib.h,你会看到rand()被定义为
static inline int rand(void){…}
即函数的实际代码在头文件中。
这就是为什么您的第一种方法会给您带来多重定义错误的原因。
第二种方法成功的原因相同,并且(因为函数是内联的)在目标文件中不生成’extern’引用,以便搜索任何库。
下一个。 您的C ++代码将链接到libc或libstdc ++(您需要检查)。 您的预构建静态库显然是针对stdlib.h编译的,该stdlib.h没有内联实现的rand()。
您需要在静态上执行LDD(或readelf)命令,并查看其所在的库在您的平台上不存在。 该库很可能与仿生库具有相同的名称,它不会导出rand()符号,因此加载器无法解析引用。
现在,至于解决这个问题……你是否能够至少重建静态库,如果不改变它们? 您的C测试文件是否为Android或本机交叉编译?
使用'android-ndk32-r10-windows-x86_64.zip'
,而不是'android-ndk64-r10-windows-x86_64.zip'
APP_ABI := armeabi armeabi-v7a x86
3 api是32位。