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.a
、libgdal.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 模拟器上 运行 我的应用程序,适用于所有可用平台:x86
、armeabi
和 armeabi-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 所以,以下任何问题的解决方案对我都有好处:
有没有办法在构建 GDAL 时避免创建 libgdal.so.x.x
文件?
有没有办法在 Qt 生成的 *.apk
文件中包含 libgdal.so.x.x
文件?
如何在 linking 静态库 libgdal.a
时避免 link-time 错误?
提前感谢您的回复!
经过几天的尝试和错误(主要是错误),我找到了解决问题的方法。
我把它写下来作为我的问题的答案,这样它可能对其他人有帮助。
问题出现在 GDAL
的 link 时间。简而言之:linker 创建了 "real name" 共享库 libgdal.so.1.17.1
以及 link 共享库 libgdal.so.1
和 libgdal.so
.
出于某些原因(我忽略了)将 link 强制为 libgdal.so
,link 人搜索 libgdal.so.1
(反过来,会搜索libgdal.so.1.17.1
).
解决我的问题的解决方法可以总结为以下步骤:
在GDAL
根目录下,运行./configure
根据需要的配置(见http://trac.osgeo.org/gdal/wiki/BuildingForAndroid)检查libtool是ENABLED
按如下方式编辑创建的 libtool 文件(例如使用 gedit
):
- 将 library_names_spec 的值替换为 library_names_spec="\$libname\${shared_ext}"
- 将 soname_spec 的值替换为 soname_spec=""
输入 make
在输出文件夹 .libs/
中,将创建唯一的 libgdal.so
,现在 link 到 libgdal.so
似乎工作正常。
我的问题如下:我使用 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 应用程序(一个带有 QPushButton
名为 TestAndroid
的简单小部件应用程序)。如果我不使用 GDAL,一切正常,我可以在 Android 模拟器上 运行 我的应用程序,适用于所有可用平台:x86
、armeabi
和 armeabi-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 所以,以下任何问题的解决方案对我都有好处:
有没有办法在构建 GDAL 时避免创建
libgdal.so.x.x
文件?有没有办法在 Qt 生成的
*.apk
文件中包含libgdal.so.x.x
文件?如何在 linking 静态库
libgdal.a
时避免 link-time 错误?
提前感谢您的回复!
经过几天的尝试和错误(主要是错误),我找到了解决问题的方法。
我把它写下来作为我的问题的答案,这样它可能对其他人有帮助。
问题出现在 GDAL
的 link 时间。简而言之:linker 创建了 "real name" 共享库 libgdal.so.1.17.1
以及 link 共享库 libgdal.so.1
和 libgdal.so
.
出于某些原因(我忽略了)将 link 强制为 libgdal.so
,link 人搜索 libgdal.so.1
(反过来,会搜索libgdal.so.1.17.1
).
解决我的问题的解决方法可以总结为以下步骤:
在
GDAL
根目录下,运行./configure
根据需要的配置(见http://trac.osgeo.org/gdal/wiki/BuildingForAndroid)检查libtool是ENABLED
按如下方式编辑创建的 libtool 文件(例如使用
gedit
):- 将 library_names_spec 的值替换为 library_names_spec="\$libname\${shared_ext}"
- 将 soname_spec 的值替换为 soname_spec=""
输入 make
在输出文件夹 .libs/
中,将创建唯一的 libgdal.so
,现在 link 到 libgdal.so
似乎工作正常。