libgdal.so android error: could not load library "libgdal.so.1"

libgdal.so android error: could not load library "libgdal.so.1"

我的问题如下:我使用 Android 工具链 (CC=i686-linux-android-gcc, CXX=i686-linux-android-c++) 成功构建了 GDAL 1.10.1,该工具链生成以下输出库 libgdal.alibgdal.la , libgdal.lai, libgdal.so, libgdal.so.1, libgdal.so.1.17.1 在输出文件夹 .libs 中(以下我将此文件夹称为 $GDAL_LIB_PATH)。

我正在尝试在 Windows 上使用 Qt 5.4 构建一个简单的 Android 应用程序(一个带有 QPushButton 名为 TestAndroid 的简单小部件应用程序)。如果我不使用 GDAL,一切正常,我可以在 Android 模拟器上 运行 我的应用程序,适用于所有可用平台:x86armeabiarmeabi-v7.

尽管如此,如果我尝试使用 GDAL(例如,通过在应用程序的初始化中简单地调用 GDALAllRegister())然后 linking 到 libgdal.so应用程序崩溃并出现以下错误:

E/art ( 1614): dlopen("/data/app/org.qtproject.example.TestAndroid-1/lib/x86/libTestAndroid.so", RTLD_LAZY) failed: dlopen failed: could not load library "libgdal.so.1" needed by "libTestAndroid.so"; caused by library "libgdal.so.1" not found

我已经验证 Android 平台是正确的 (x86),否则 link 用户会跳过错误的 libgdal.so 对象。

我使用 ANDROID_EXTRA_LIBS *= $GDAL_LIB_PATH/libgdal.so*.apk(由 Qt 生成)中包含了 libgdal.so。其他文件 libgdal.so.x.x 无法以相同的方式包含,因为 Qt 阻止了它。

为了避免动态 linking 我也尝试 link 我的应用程序 libgdal.a 但是出现很多 link-time 错误(例如未定义的引用至 'atof')

我在网上搜索过,但没有找到解决问题的方法。

我并不局限于使用动态 linking 所以,以下任何问题的解决方案对我都有好处:

  1. 有没有办法在构建 GDAL 时避免创建 libgdal.so.x.x 文件?

  2. 有没有办法在 Qt 生成的 *.apk 文件中包含 libgdal.so.x.x 文件?

  3. 如何在 linking 静态库 libgdal.a 时避免 link-time 错误?

提前感谢您的回复!

经过几天的尝试和错误(主要是错误),我找到了解决问题的方法。

我把它写下来作为我的问题的答案,这样它可能对其他人有帮助。

问题出现在 GDAL 的 link 时间。简而言之:linker 创建了 "real name" 共享库 libgdal.so.1.17.1 以及 link 共享库 libgdal.so.1libgdal.so.

出于某些原因(我忽略了)将 link 强制为 libgdal.so,link 人搜索 libgdal.so.1(反过来,会搜索libgdal.so.1.17.1).

解决我的问题的解决方法可以总结为以下步骤:

  1. GDAL根目录下,运行./configure根据需要的配置(见http://trac.osgeo.org/gdal/wiki/BuildingForAndroid)检查libtool是ENABLED

  2. 按如下方式编辑创建的 libtool 文件(例如使用 gedit):

    • library_names_spec 的值替换为 library_names_spec="\$libname\${shared_ext}"
    • soname_spec 的值替换为 soname_spec=""
  3. 输入 make

在输出文件夹 .libs/ 中,将创建唯一的 libgdal.so,现在 link 到 libgdal.so 似乎工作正常。