Не удается найти символ "пол" во время выполнения
Я кросс-скомпилировал сервер http Mongoose для Android, используя Linux в качестве системы BUILD, android-ndk от Google в качестве набора инструментов и пользовательский скрипт, который в итоге выполняет следующую команду:
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
Скрипты работают без ошибок, и создается финальный исполняемый файл 'server'. Проблема у меня сейчас при попытке запустить его на Android. Он жалуется, что математические символы (определенные в libm), такие как "floor", не могут быть найдены. Я не очень понимаю, почему их можно найти во время компиляции, но не во время выполнения, но у меня есть некоторые сомнения по поводу кросс-компиляции для Android и настройки компиляции, которые я опишу ниже:
Некоторые параметры / флаги, которые я выбрал для кросс-компиляции, являются произвольными, так как я не до конца понимаю все (тысячи) параметров gcc и выбрал то, что люди предлагают на разных форумах. В частности, -mfloat-abi = softfp, -mfpu = неон и -mvectorize-with-neon-quad
Я также выбрал произвольно платформы /android-19, так как это был самый новый установленный в моей системе. Я не знаю точно, чем отличаются версии "N" для android и каковы последствия выбора той или иной версии (безопаснее ли выбрать самую новую?, самую старую?) Или я должен выбрать другую для каждой другое устройство / цель?).
Я также произвольно выбрал сборку gcc-4.6 arm-linux-androideabi-gcc. В android-ndk также установлен gcc-4.8. Есть ли какие-то предпочтения, или опять же, это зависит от конечной цели? (а может это и не имеет ничего общего)
Заранее спасибо за любую помощь, подсказку или ссылку!
1 ответ
Наконец, похоже, что источником проблем был отсутствующий флаг компиляции в библиотеках LUA (-DLUA_USE_DLOPEN). Это привело к тому, что программное обеспечение правильно скомпилировалось, но во время выполнения оно не смогло загрузить символы, определенные "где-либо еще".