【问题标题】:Compile OpenBR to ArmV7 - Android toolchain issue将 OpenBR 编译为 ArmV7 - Android 工具链问题
【发布时间】:2014-11-26 12:02:33
【问题描述】:

我已经成功通过install/build instructions for OpenBR on linux

我的目标是在 android 上构建和运行 OpenBR。

经过大量的修修补补,我终于成功地为 armv7 构建了 OpenBR。我的问题是,当我执行 "System.loadLibrary("openbr")" 时出现错误:

11-25 23:40:31.221: E/dalvikvm(29742): dlopen("/data/app-lib/com.test.app-28/libopenbr.so") failed: dlopen failed: could not load library "/home/ubuntu/qt5.1.1/android_armv7/lib/libQt5Concurrent.so.5.1.1" needed by "libopenbr.so"; caused by library "/home/ubuntu/qt5.1.1/android_armv7/lib/libQt5Concurrent.so.5.1.1" not found

我相信我已正确包含 armv7 libQt5Concurrent 库(在 android.mk 中作为本地模块加载),但我认为问题在于 libopenbr 在加载时正在查找错误的目录(如错误消息中所示) .它试图在编译机器上查找路径。

在 libopenbr.so 上运行 readelf 会产生以下结果:

 0x00000001 (NEEDED)                     Shared library: [/home/ubuntu/qt5.1.1/android_armv7/lib/libQt5Concurrent.so.5.1.1]
 0x00000001 (NEEDED)                     Shared library: [/home/ubuntu/qt5.1.1/android_armv7/lib/libQt5Core.so.5.1.1]
 0x00000001 (NEEDED)                     Shared library: [/home/ubuntu/qt5.1.1/android_armv7/lib/libQt5Gui.so.5.1.1]
 0x00000001 (NEEDED)                     Shared library: [/home/ubuntu/qt5.1.1/android_armv7/lib/libQt5Network.so.5.1.1]
 0x00000001 (NEEDED)                     Shared library: [/home/ubuntu/qt5.1.1/android_armv7/lib/libQt5Sql.so.5.1.1]
 0x00000001 (NEEDED)                     Shared library: [/home/ubuntu/qt5.1.1/android_armv7/lib/libQt5Widgets.so.5.1.1]
 0x00000001 (NEEDED)                     Shared library: [/home/ubuntu/qt5.1.1/android_armv7/lib/libQt5Xml.so.5.1.1]
 0x00000001 (NEEDED)                     Shared library: [libz.so]
 0x00000001 (NEEDED)                     Shared library: [libdl.so]
 0x00000001 (NEEDED)                     Shared library: [libm.so]
 0x00000001 (NEEDED)                     Shared library: [liblog.so]
 0x00000001 (NEEDED)                     Shared library: [libc.so]

如何获取它,以便在编译时不使用此路径搜索 Qt 库?

我尝试了各种 cmake 指令,包括 openbr CMakeLists.txt 中这些变量的各种排列:

SET(CMAKE_SKIP_RPATH TRUE)

# use, i.e. don't skip the full RPATH for the build tree
SET(CMAKE_SKIP_BUILD_RPATH  TRUE)

# when building, don't use the install RPATH already
# (but later on when installing)
SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)

# the RPATH to be used when installing
SET(CMAKE_INSTALL_RPATH "")

# don't add the automatically determined parts of the RPATH
# which point to directories outside the build tree to the install RPATH
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE)

任何从我构建的库的共享库路径中获取此路径的帮助都会很棒!谢谢!

【问题讨论】:

    标签: android c++ qt android-ndk cmake


    【解决方案1】:

    实际上我终于想出了如何通过更新每个 qt lib 的 cmake 文件来解决这个问题,使其不在文件名末尾包含版本字符串!

    【讨论】:

      【解决方案2】:

      使用 System.loadLibrary() 加载动态库时,您需要先打开所有依赖项,因为 System.loadLibrary() 不会为您加载它们。

      所以可能你必须这样做: System.loadLibrary("libQt5Concurrent") System.loadLibrary("openbr")

      如果 libQt5Concurrent 有其他依赖项,你必须以同样的方式加载它们。

      【讨论】:

      • 杰拉德,我可以在openbr之前成功加载qt5concurrent。但是,openbr 似乎正在查看我的编译机中用于 qt5concurrent 的硬编码路径并且失败了。
      • 在我的帖子里:11-25 23:40:31.221: E/dalvikvm(29742): dlopen("/data/app-lib/com.test.app-28/libopenbr.so ") 失败:dlopen 失败:无法加载“libopenbr.so”所需的库“/home/ubuntu/qt5.1.1/android_armv7/lib/libQt5Concurrent.so.5.1.1”;由库“/home/ubuntu/qt5.1.1/android_armv7/lib/libQt5Concurrent.so.5.1.1”引起的未找到我相信问题在于它很难编码以查看/home/ubuntu/qt5.1.1/android_armv7/ lib/libQt5Concurrent.so.5.1.1 加载库,但系统上显然不存在该路径。
      • 这听起来像是一个链接问题。你自己编译 QT 库吗?在这里,我使用的是cmake,我看到命令行在链接命令行中有这样的东西:-shared -Wl,-soname,libMyLib.so,如果我没记错的话,这是为了避免硬编码路径。检查您是否可以使用此链接 QT 库。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多