我正在创建一个命令行 C++ 测试应用程序(可执行),以便在我的 root Android 设备上运行。
该可执行文件使用多个预构建的 C 库,其中之一使用“rand()”。在链接状态期间我收到错误“'rand' 的未定义引用"
为了检查路径是否设置正确,我尝试了以下方法但没有成功。
第一种方法:我在我的测试源中定义了 rand() 。
我注意到我收到多个定义错误,第一个定义位于 bionic/libc/include/stdlib.h 中
第二种方法:在我的测试应用程序中使用 rand()
我注意到链接器在这里没有抱怨未定义的符号
第三种方法:取消归档并归档所有目标文件
发现我仍然收到未定义的引用错误。
当使用“rand”的 C 库使用 C 测试文件编译为可执行文件时,不会出现上述链接器错误。
我无法修改预构建的静态库,需要在基于 C++ 的测试应用程序中使用该库。
任何意见都将非常受欢迎。
积分不够,无法发表评论,所以...
如果你查看bionic的stdlib.h,你会看到rand()被定义为
static inlineint 兰特(void) { ... }
即该函数的实际代码位于头文件中。
这就是为什么您的第一种方法会给您带来多重定义错误。
出于同样的原因,第二种方法会成功,并且(因为该函数是内联的)在目标文件中不会生成“外部”引用来导致搜索任何库。
下一个。您的 C++ 代码将链接到 libc 或 libstdc++(您需要检查)。您的预构建静态库显然是针对 stdlib.h 进行编译的,该 stdlib.h 没有 rand() 的内联实现。
您需要在静态上执行 LDD(或 readelf)命令,并查看它正在寻找的库在您的平台上不存在。该库很可能与仿生库具有相同的名称,而仿生库不导出 rand() 符号,因此加载程序无法解析引用。
现在,至于解决这个问题......您是否至少能够重建静态库(如果不能更改它们)?您的 C 测试文件是针对 Android 交叉编译的,还是本机编译的?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)