【问题标题】:Building android app on Qt using additional library (Assimp)使用附加库 (Assimp) 在 Qt 上构建 android 应用程序
【发布时间】:2015-03-23 10:52:52
【问题描述】:

您好,我正在尝试将 OpenGL 桌面应用程序移植到 android。我对android开发一无所知,所以我依赖Qt Creator来打包应用程序。作为设置的一部分,我在 android ndk 中使用以下设置调用了“make-standalone-toolchain”脚本

--platform=android-21 
--toolchain=arm-linux-androideabi-4.9 
--system=linux-x86_64

然后我使用 android-cmake 并将我新创建的独立工具链的路径传递给它,它在我的 assimp 目录树中创建了 libassimp.so、libassimp.so.3 和 libassimp.so.3.1.1(ln) .

我将 libassimp.so 路径传递给“其他库”下的 Qt 创建者项目构建菜单。但是,在 android 上部署应用程序时,它会因错误而崩溃:

 dlopen("/data/app/org.qtproject.example.a3dqtquick-2/lib/arm/lib3dqtquick.so", RTLD_LAZY) failed: dlopen failed: could not load library "libassimp.so.3" needed by "lib3dqtquick.so"; caused by library "libassimp.so.3" not found

我什至可以在项目构建目录中看到 libassimp.so(不是 libassimp.so.3)文件 ../android-build/libs/armeabi-v7a.

不知道从哪里开始,手动将 libassimp.so.3 放在这个位置并不能解决问题。谢谢阅读。我将在您的反馈中添加更多信息。请原谅任何信息不足,因为这是我第一次使用 android 进行实验。

下面是deployment-settings.json文件

  "description": "This file is generated by qmake to be read by androiddeployqt and should not be modified by hand.",
   "qt": "/home/ubashir/programs/Qt/5.4/android_armv7",
   "sdk": "/home/ubashir/programs/android-sdk-linux",
   "sdkBuildToolsRevision": "21.1.2",
   "ndk": "/home/ubashir/programs/android-ndk-r10d",
   "toolchain-prefix": "arm-linux-androideabi",
   "tool-prefix": "arm-linux-androideabi",
   "toolchain-version": "4.9",
   "ndk-host": "linux-x86_64",
   "target-architecture": "armeabi-v7a",
   "qml-root-path": "/home/ubashir/code/3dqtquick",
   "application-binary": "/home/ubashir/code/3dqtquickAndroid/lib3dqtquick.so" 

更新:

我现在已经尝试过了。将所有指向 assimp.so.3.1.1 的链接替换为后者的副本,所以现在我的库 libassimp.so.3 是一个文件,而不是指向 libassimp.so.3.1.1 的链接。我手动将 libassimp.so.3 添加到我的项目子文件夹 android/libs/aremabi-v71 --- 不好。我确认我的构建目录显示了所有 libassimp 文件,因为我手动添加了它们,所以推测它们正在被部署,但错误仍然存​​在:

failed: dlopen failed: could not load library "libassimp.so.3" needed by "lib3dqtquick.so".

如此处所述http://webmail.dev411.com/p/gg/android-ndk/1386vger6e/use-assimp-c-library-in-ndk-ld-error-obj-local-armeabi-v7a-libassimp-so-incompatible-target-for-use-with-vuforia

我什至在我的 android 的 assimp 构建目录上运行 cmake 后编辑了 link.txt 文件,用 -soname,libassimp.so 更改条目 -soname,libassimp.so.3 但它仍然创建 libassimp.so.3.1。 1 及其两个链接,即 libassimp.so.3 和 libassimp.so。所以还是卡住了..

【问题讨论】:

  • 应用程序在 lib3dqtquick.so 文件上调用 dlopen() 的位置,您可以在其上方添加另一个 dlopen() 并带有依赖项的完整路径吗?我只是在猜测,但也许链接器在不同的路径中寻找 .so,这就是它找不到它的原因。
  • 您必须手动复制库对我来说听起来很奇怪。您是否在.pro 文件中设置了ANDROID_EXTRA_LIBS
  • 我同时使用了ANDROID_EXTRA_LIBS和手动,因为前者似乎没有添加后缀为.so.3的文件
  • 嗯,很奇怪。我一直部署在 Qt Creator 中创建的库,所以我无法判断直接使用 ndk 创建的库。深入研究会很有趣。

标签: android qt android-ndk cmake assimp


【解决方案1】:

我在使用 CMake for 和 Android 项目构建的共享库时遇到了同样的问题。我找到了修复它的方法。如果您更熟悉 CMake,可能会有更简洁的解决方案。

在 CMakeLists.txt 文件中搜索“SOVERSION”和“SET_TARGET_PROPERTIES()”

在 SET_TARGET_PROPERTIES() 例程中注释掉 VERSION 和 SOVERSION 的行,如下所示

SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES                # create *nix style library versions + symbolic links
    DEFINE_SYMBOL DSO_EXPORTS
        #   VERSION ${PROJECT_VERSION}
        #   SOVERSION ${PROJECT_SOVERSION}
    CLEAN_DIRECT_OUTPUT 1                   # allow creating static and shared libs without conflicts
    OUTPUT_NAME "${PROJECT_NAME}${PROJECT_DLLVERSION}"  # avoid conflicts between library and binary target names
)

然后在 CMake 中重新运行配置和生成步骤并重建目标。这应该会给你一个没有任何版本号的 .so。

【讨论】:

    【解决方案2】:

    我建议你看看我发现的问题的解决方案(与你的非常相似):

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

    希望这会有所帮助。

    【讨论】:

    • 感谢您的提示。我已阅读您的帖子,并根据我采取的步骤更新了我的问题。 assimp 使用 cmake 系统,您的项目基于 libtools,所以我无法完全复制您的步骤。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    • 2019-08-18
    • 1970-01-01
    相关资源
    最近更新 更多