【发布时间】:2018-05-27 15:12:53
【问题描述】:
对于一个项目,我使用带有 CMake 的 Android gradle 脚本,gradle 插件是 3:0:0 版本,CMake 版本是 3.6。 gradle 和 CMake 文件都非常简单且无趣(只需定义使用的文件 - 我仍然可以根据需要复制粘贴它们)。
我有以下项目结构;基本上是一个代码库,产生了几十个 .so 文件(被打包到 apk 中的 Android 包的本机部分,因此称为“可执行文件”),它们都依赖于相同的共享库代码(静态库,因此称为“库” ')。库代码仍然(相对)易变,所以我希望可执行文件对它们具有项目级别的依赖关系,这样每当构建可执行文件时,每次更改代码时都会按需重建库。 结构如下:
+ LibProjects/
---Bin/ (Originally empty)
---Lib1/CMakeLists.txt (+sources files, same level as the CMakeLists.txt)
...
---Lib10/CMakeLists.txt (same)
+ Executables/
---Executable1/CMakeLists.txt (source files here)
--------------/AndroidFiles/build.gradle (and other android project files)(points to the CMakeLists.txt)
...
---Executable40/CMakeLists.txt
库的 CMakeLists 使用
将其输出重定向到 Bin 文件夹set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY {CMAKE_CURRENT_SOURCE_DIR}/../Bin/${ANDROID_ABI}/${LibraryName})
可执行文件的项目“正常”添加对库的依赖项
add_subdirectory(${PROJECTS_ROOT}/LibProjects/${LibraryName} ${PROJECTS_ROOT}/Framework/Bin/Android/${ANDROID_ABI}/${LibraryName})...
几乎一切正常,因为我可以获得合理的可执行文件并且可执行文件触发库的构建。
问题在于,在按顺序构建可执行文件时,每个都不会重用其他库项目的输出:当我构建 Executable1 时,它将构建所有库(正常),然后它会自行构建。之后,当我构建 Executable2 时,它不会重用已经为 Executable1 构建的库,依此类推——这有效地将我的构建时间增加了约 10 倍。
我可以按预期在 /Bin 文件夹中找到每个库的构建输出,但它们不会跨可执行文件重用 - bin 文件夹中没有 CMake“项目文件”(这是正确的术语),它们都在可执行的构建目录中生成。
我要解决的问题是构建时间源于每个库都为每个可执行文件重新构建的事实。
目前我正在考虑的解决方案是以某种方式指示 CMake 使用 Bin 文件夹(或另一个文件夹)作为其自己文件夹中每个库的工作文件夹,而不是使用可执行文件,希望 gradle android 插件将足够聪明,然后发现 cmakefile 和目标文件都不需要重新生成,并避免重新生成。
我的限制是我不能重组代码库本身,并且每个可执行文件必须与其他可执行文件分开构建 - 绝对没有顶级 CMake 的可能性 - 每个可执行文件都应该能够被触发自己的。
【问题讨论】:
-
AndroidFiles 你只有在Executable1下吗?或者你有 40 个?
-
看起来像一个依赖问题,你能检查你的目标是否明确列出了每个目标的依赖关系吗?另外,如果您可以为库和可执行文件发布
CMakeLists.txt。 -
AndroidFiles 我有 40 个。我可以发布 CMakeLists,但它们不会告诉你任何东西——依赖关系就是我发布的内容。这不是“依赖问题”,因为行为是预期的,这不是我想要的 - 请参阅下面 Oliv 的回答。
标签: android c++ cmake android-ndk android-gradle-plugin