2015-01-21 3 views
0

моя проблема в следующем: я успешно построил GDAL 1.10.1 с помощью инструментальной цепочки Android (CC = i686-linux-android-gcc, CXX = i686-linux-android-C++), который создает следующие выходные библиотеки libgdal.a, libgdal.la, libgdal.lai, libgdal.so, libgdal.so.1, libgdal.so.1.17.1 в выходной папке .libs (в следующем я буду называть эту папку $ GDAL_LIB_PATH).Ошибка libgdal.so android: не удалось загрузить библиотеку «libgdal.so.1»

Я пытаюсь создать простое приложение для Android (простое приложение-виджет с QPushButton с именем TestAndroid) с использованием Qt 5.4 в Windows. Если я не использую GDAL, все работает отлично, и я могу запустить свое приложение на эмуляторе Android для всех доступных платформ: x86, armeabi и armeabi-v7.

Тем не менее, если я пытаюсь использовать GDAL (бывший простой вызов GDALAllRegister() в инициализации приложения.), А затем ссылки на libgdal.so сбоев приложения со следующей ошибкой:

E/искусства (1614): dlopen ("/ data/app/org.qtproject.example.TestAndroid-1/lib/x86/libTestAndroid.so", RTLD_LAZY) не удалось: dlopen не удалось: не удалось загрузить библиотеку "libgdal.so.1" необходимо по "libTestAndroid.so"; вызванное библиотекой «libgdal.so.1» не найден

Я проверил, что платформа Android является правой (x86), иначе линкер пропустит неправильный объект libgdal.so.

Я включил libgdal.so в * .apk (сгенерированный Qt), используя ANDROID_EXTRA_LIBS * = $ GDAL_LIB_PATH/libgdal.so. Другие файлы (libgdal.so.x.x) не могут быть включены таким же образом, поскольку Qt предотвращает это.

Для того, чтобы избежать динамической компоновки Я также пытался связать мое приложение с libgdal.a, но много ошибок канального времени появляется (напр., Неопределенная ссылка на «atof»)

Я искал в Интернете, но Я не нашел решение моей проблемы.

Я не стеснен использовать динамическое связывание так, решение любой из следующих проблем, хорошо для меня:

  1. есть способ, чтобы избежать создания libgdal.so.xx файлов при здание GDAL?

  2. есть ли способ включить файлы libgdal.so.x.x в файл * .apk, созданный Qt?

  3. Как избежать ошибок времени соединения при связывании статической библиотеки libgdal.a?

Заранее благодарим за любой ответ!

+0

Hi, такой же проблема здесь. Пожалуйста, обновите меня, когда решите свое. http://stackoverflow.com/questions/28126189/building-android-app-on-qt-using-additional-library-assimp – Maelstorm

ответ

2

После нескольких дней испытаний и ошибок (главным образом, ошибок) я нашел решение моей проблемы.

Я пишу это как ответ на свой вопрос, чтобы он мог быть полезным другим.

Проблема была во время связи GDAL. Вкратце: компоновщик создал общую библиотеку «настоящее имя» libgdal.so.1.17.1 вместе со ссылками на нее (libgdal.so.1 и libgdal.so).

По каким-то причинам (который я игнорирую), заставляя ссылку на libgdal.so, компоновщик ищет libgdal.so.1 (который, в свою очередь, wuold искал libgdal.so.1.17.1).

Чтобы обойти эту проблему, что решить мою проблему можно суммировать в следующих шагов:

  1. В корне GDAL, запустить ./configure в соответствии с требуемой конфигурацией (см http://trac.osgeo.org/gdal/wiki/BuildingForAndroid) проверки того, что Libtool включена

  2. редактировать созданный Libtool файл (например, с Gedit) следующим образом:

    • заменить значение library_names_spec с library_names_spec = "\ $ Имя_библиотеки \ $ {shared_ext}"
    • заменить значение soname_spec с soname_spec = ""
  3. типа делают

В выходной папке .libs/будет создан только файл libgdal.so, и теперь ссылка на libgdal.so работает нормально.