找不到符号' floor'在运行时

时间:2014-08-14 09:40:29

标签: android android-ndk cross-platform libm

我使用Linux作为BUILD系统交叉编译了用于Android的http Mongoose服务器,使用Google作为工具链的android-ndk以及最终执行下一个命令的自定义脚本:

arm-linux-androideabi-gcc -DANDROID -march=armv7-a -mfpu=neon \
  -mfloat-abi=softfp -mvectorize-with-neon-quad \
  -I /opt/android-ndk-r9d/platforms/android-19/arch-arm/usr/include \
  -I ~/Package_sources/BUILD_arm-linux-androideabi/include \
  -DMONGOOSE_USE_LUA -DMONGOOSE_USE_LUA_SQLITE3 \ 
  -L/opt/android-ndk-r9d/platforms/android-19/arch-arm/usr/lib \
  -L~/Package_sources/BUILD_arm-linux-androideabi/lib \
  -L~/Package_sources/BUILD_arm-linux-androideabi/lib -lluasqlite3 \
  server.c mongoose.c -o server -llua51 -lm

脚本运行正常,没有错误,最终的服务器' elf可执行文件已创建。我现在遇到的问题是尝试在Android上启动它。它抱怨数学符号(在libm中定义)喜欢" floor"无法找到。 我真的不明白为什么可以在编译时找到它们而不是在运行时,但我对Android和编译设置的交叉编译有一些疑问,我接下来会描述:

  • 我选择交叉编译的一些选项/标志是任意的,因为我不完全理解所有(数千个)gcc选项,我选择了人们在不同论坛上建议的内容。特别是-mfloat-abi = softfp,-mfpu = neon和-mvectorize-with-neon-quad

  • 我也随意选择了平台/ android-19,因为它是我系统中安装的最新版本。我不知道究竟有多么不同的android - " N"版本有所不同,选择一个或另一个有什么含义(选择最新版本更安全吗?最老版本?,或者我必须为每个不同的设备/目标选择不同的版本吗?)。

  • 我还随意选择了gcc-4.6 arm-linux-androideabi-gcc构建。 android-ndk中还安装了gcc-4.8。是否有任何偏好,或者它又取决于最终目标? (或者它可能无关)

提前感谢您提供任何帮助,提示或链接!

1 个答案:

答案 0 :(得分:0)

最后看起来问题的根源是LUA库中缺少编译标志(-DLUA_USE_DLOPEN)。这导致软件正确编译,但在运行时它无法加载,因此符号“在任何其他地方”定义。