经过几天的试验和错误(主要是错误),我找到了解决问题的方法。
[我的问题如下:我已经成功使用Android工具链GDAL 1.10.1
构建了(CC=i686-linux-android-gcc, CXX=i686-linux-android-c++)
,该工具链会产生以下输出库libgdal.a
,libgdal.la
,libgdal.lai
,libgdal.so
,libgdal.so.1
,[C0 ]在输出文件夹libgdal.so.1.17.1
中的名称(在下文中,我将该文件夹称为.libs
)。
我正在尝试在Windows上使用Qt 5.4构建一个简单的Android应用(一个名为$GDAL_LIB_PATH
的简单小工具应用,并带有QPushButton
。如果我不使用GDAL,则一切正常,并且可以在适用于所有可用平台的Android模拟器上运行我的应用程序:TestAndroid
,x86
和armeabi
。
尽管如此,如果我尝试使用armeabi-v7
(例如,通过在应用程序的初始化中简单地调用GDAL
,然后链接到GDALAllRegister()
,则应用程序崩溃并出现以下错误:
E / art(1614):dlopen(“ / data / app / org.qtproject.example.TestAndroid-1 / lib / x86 / libTestAndroid.so”,RTLD_LAZY)失败:dlopen失败:无法加载库“ libTestAndroid.so”所需的“ libgdal.so.1”;由图书馆造成找不到“ libgdal.so.1”
我已验证Android平台是正确的平台(x86),否则链接程序将跳过错误的libgdal.so
对象。
我已使用libgdal.so
将libgdal.so
包括在*.apk
(由Qt生成)中。由于Qt禁止,其他文件ANDROID_EXTRA_LIBS *= $GDAL_LIB_PATH/libgdal.so
不能以相同的方式包含。
为了避免动态链接,我还尝试将我的应用程序与libgdal.so.x.x
链接,但是出现许多链接时错误(例如,未定义的对'atof'的引用)
我在网上搜索过,但没有找到解决问题的方法。
我不被迫使用动态链接,因此,解决以下任何一个问题对我都是有益的:
构建GDAL时是否有避免创建libgdal.a
文件的方法?] >>
在Qt生成的libgdal.so.x.x
文件中是否包含libgdal.so.x.x
文件的方法?]
链接静态库*.apk
时如何避免链接时错误?
感谢您的任何答复!
我的问题如下:我已经使用产生以下输出库的Android工具链(CC = i686-linux-android-gcc,CXX = i686-linux-android-c ++)成功构建了GDAL 1.10.1 ...
经过几天的试验和错误(主要是错误),我找到了解决问题的方法。
我将其写为我的问题的答案,以便对他人有所帮助。
问题出在libgdal.a
的链接时间内。简要地说:链接器创建了“实名”共享库GDAL
以及指向它的链接libgdal.so.1.17.1
和libgdal.so.1
。
由于某些原因(我忽略),将链接强制为libgdal.so
,链接器将搜索libgdal.so
(反过来,其将搜索libgdal.so.1
)。
可以在以下步骤中总结解决我的问题的解决方法:
在libgdal.so.1.17.1
根目录中,根据所需配置运行GDAL
(请参阅./configure
),检查libtool是否为http://trac.osgeo.org/gdal/wiki/BuildingForAndroid
按如下方式编辑创建的libtool文件(例如,使用ENABLED
):
Type make
在输出文件夹gedit
中将创建唯一的.libs/
,现在libgdal.so
的链接似乎可以正常工作。
经过几天的试验和错误(主要是错误),我找到了解决问题的方法。