c++ - 我的预制件不包含二进制文件或包含

标签 c++ boost android-ndk

prefab 成功运行,但我生成的 prefab 目录中只有 CMake 文件,没有其他 Assets 。我的目标是轻松地与同事共享二进制 Assets 并将它们包含在我的 Android 构建中。我做错了什么?

我正在尝试创建一个 boost 的预制件(尽管如果 it gets enough votes 谷歌可能会制作一个)。我用了Boost-for-Android构建 boost 1.73.0,将相关的包含和库复制到 assembly 目录中,用 prefab.jsonmodule.json 填充它和 abi.json 文件,然后运行

prefab --output "/home/developer/workspace/boost-prefab/out/boost/x86_64" \
  --build-system cmake        \
  --platform     android      \
  --abi          "x86_64"     \
  --os-version   "21"         \
  --ndk-version  "21"         \
  --stl          "c++_static" \
  "/home/developer/workspace/boost-prefab/assembly/boost"

但是生成的目录每个 abi 只包含两个 CMake 文件。

 $ find x86_64 -type f
 x86_64/lib/x86_64-linux-android/cmake/boost/boostConfig.cmake
 x86_64/lib/x86_64-linux-android/cmake/boost/boostConfigVersion.cmake

我创建的程序集目录看起来像(我遵循了 prefab structure prescribed in the docs ):

boost/prefab.json
      modules/filesystem/
                         module.json
                         include/boost/...
                         libs/android.x86_64/
                                             abi.json
                                             libboost_filesystem.a
     modules/system/
                    module.json
                    include/boost/...
                    libs/android.x86_64/
                                        abi.json
                                        libboost_system.a

prefab.json:

{"schema_version": 1, "name": "boost", "version": "1.73.0", "dependencies": []}

modules/filesystem/module.json:

{"library_name": "libboost_filesystem"}

modules/filesystem/libs/android.x86_64/abi.json:

{"abi": "x86_64", "api": 21, "ndk": "21", "stl": "c++_static"}

我承认我对预制件的 os-version 感到困惑,据我所知它只是 NDK 版本(因为它不是 API 版本或 Android 主要版本号),但我不要认为那是问题所在。

我还尝试通过 vcpkg 生成一个 boost 预制件,但是 boost 现在不会在 vcpkg 中构建(有一些 PR 可以解决这个问题,但我无法构建它。)无论如何,vcpkg's example显示了一个略有不同的布局以及将 AAR 插入到预制件中的位置。

我的目标是拥有一个预构建的 boost 存档,我的同事可以轻松将其导入到他们的 Android 项目中。

  • 我是不是误解了预制文件的用途?
  • 即使与默认的 boost 文件相比,确实生成的 CMake 文件看起来也很原始,我更喜欢 boost CMake 文件而不是这里创建的预制文件
  • 我是否应该先尝试为 boost 创建 AAR?

一天结束时,我能够在我的 Android 项目中使用 Boost 的唯一方法是将其构建包含在我的 CMAKE_FIND_ROOT_PATH 中,但如果归结为这个,预制件的优势是什么?我觉得我还不如integrate conan into my gradle build .

最佳答案

Am I simply misunderstanding what a prefab file is for?

根据你的下一个问题,只是略微。它是一个以与构建系统无关的方式分发预构建库的系统。除了“构建系统不可知论者”之外,这与您正在尝试做的事情一致。

The CMake files that do get generated seem primitive even compared to the default boost ones, i.e. I'd prefer the boost CMake files to the prefab ones being created here

Prefab 旨在支持任意构建系统,而不需要包作者关心单独支持每个系统。这对 Android 来说很重要,因为虽然许多人使用 CMake,但 ndk-build 也是官方支持的选项,并且还经常使用数十种其他构建系统。

您缺少哪些由 boost 自己的 CMake 文件提供的功能?可以在 https://github.com/google/prefab/issues 提交功能请求如果这是我们可以以与构建系统无关的方式来做的事情。

如果它不能以与构建系统无关的方式进行描述,那么 Prefab 就不是一个合适的选择。 vcpkg 可能是更好的选择。

Should I instead be trying to create an AAR for boost first?

是的,这是使用 AGP 预制包的最简单方法。 vcpkg 通常是给定现有语料库的最简单途径,但正如您所指出的,您需要向他们发送补丁(或错误报告)以首先修复他们的构建。

或者,https://android.googlesource.com/platform/tools/ndkports/是我们如何构建我们目前发布的少数。应该很容易 checkout ,添加您自己的端口文件,并构建您的 AAR。如果您向我们发送补丁,我可能会在测试基础架构启动并运行后将其合并(目前我们无法支持许多包,因为测试是手动的)。

End of the day, the only way I was able to use Boost in my Android project was to include its build in my CMAKE_FIND_ROOT_PATH, but if it comes down to this what's the advantage of prefab?

如果您使用 AAR,则不需要这样做。如果您这样做,AGP 会为您处理细节。预期的用例是构建系统来集成预制件,而不是让用户必须完成这项工作。 AGP 已经这样做了,但只有在从 AAR 消费时才这样做。

关于c++ - 我的预制件不包含二进制文件或包含,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62733333/

相关文章:

c++ - 从文件构建 Boost 图(邻接表)

c++ - 针对 Boost 库编译 Nuke 插件

android-ndk - Android NDK - 无需 Android Studio 即可构建 native 库

android - 如何在 Android Native ARM64 上调用清除缓存?

c++ - 热键控制键码困惑

c++ - C++ Boost 库中的链接错误

c++ - void 函数调用不起作用 C++

android - 如何通过 C/C++ 从 Linux 命令获取输出?适合安卓吗?

c++ - 为什么在空流上调用时 std::istream::ignore 不返回?

c++ - 在模板上下文中通过引用传递的参数的 'const' 限定符的位置