libgdal.so android错误:无法加载库“libgdal.so.1”

时间:2015-01-21 09:45:23

标签: android qt gdal

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

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

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

E / art(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对象。

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

为了避免动态链接,我还尝试将我的应用程序与libgdal.a链接,但会出现许多链接时错误(例如,对'atof'的未定义引用)

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

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

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

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

  3. 如何在链接静态库libgdal.a时避免链接时错误?

  4. 预先感谢您的回复!

1 个答案:

答案 0 :(得分: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根目录中,根据所需配置(请参阅http://trac.osgeo.org/gdal/wiki/BuildingForAndroid)运行./configure,检查libtool是否已启用

  2. 编辑创建的libtool文件(例如使用gedit),如下所示:

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

  4. 在输出文件夹.libs /中将创建唯一的libgdal.so,现在指向libgdal.so的链接似乎工作正常。