使用cmake/make打包Android 动态库

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用cmake/make打包Android 动态库相关的知识,希望对你有一定的参考价值。

参考技术A 打包需要使用cmake是AndroidSdk目录下的
$ANDROID_HOME/cmake/3.6.4111459/bin/cmake

参数:
-H

-B

-DANDROID_NDK

-DCMAKE_LIBRARY_OUTPUT_DIRECTORY

-DCMAKE_MAKE_PROGRAM

-DCMAKE_TOOLCHAIN_FILE

-DANDROID_ABI

-DCMAKE_BUILD_TYPE

-DANDROID_NATIVE_API_LEVEL 最低支持的Api版本
-DANDROID_TOOLCHAIN

-DCMAKE_GENERATOR

打包所有abi的脚本例子:

在使用 cmake 构建时,如何让 make 变得冗长但只有“有意义”的行?

【中文标题】在使用 cmake 构建时,如何让 make 变得冗长但只有“有意义”的行?【英文标题】:How can I get make to be verbose but with only "meaningful" lines when building with cmake? 【发布时间】:2021-12-17 23:11:09 【问题描述】:

我在我的一个项目中使用带有 GNU Make 生成器的 CMake,然后想要构建它 - 很详细。

我对实际产生东西的行感兴趣,而不是对以下行感兴趣:

gmake[2]: Entering directory '/some/where'
gmake[2]: Leaving directory '/some/other/place'

也不是说:

cd /some/where && /path/to/cmake/bin/cmake -E cmake_link_script CMakeFiles/some.dir/link.txt --verbose=1

因为它们“包装”了 cmake 运行该脚本时将发生的实际工作(例如,调用 gcc 等链接器可执行文件)。

我不太介意百分比标题,例如:

[ 97%] Building CXX object /path/to/proj/CMakeFiles/something.dir/foo.o

即如果您的解决方案删除了​​它们,那么很好,如果它保留它们 - 也很好。

我已经阅读了这个问题的答案和 cmets:Using CMake with GNU Make: How can I see the exact commands?,到目前为止我想出的最好的是:

MAKEFLAGS="$MAKEFLAGS --no-print-dir" cmake --build build_dir/  --verbose 

--verbose 为您提供最大的 (?) 冗长性,包含您不想要的所有内容。然后,--no-print-dir 被 GNU Make 拾取,从而避免了进入/离开目录消息。

我可以做得更好,实际上避免使用cdcmake -E 命令吗?

注意事项:

我意识到我可以使用最大详细程度,然后使用 grep 进行过滤。这不是我想要的 - 我希望一开始就不要发出这些行。 不得将任何内容硬编码到CMakeLists.txt 文件中;在 CMake 配置之后,一切都必须通过命令行完成。

【问题讨论】:

我确定MAKEFLAGS+="--no-print-dir" 是一个错字,而您的意思是MAKEFLAGS="--no-print-dir" @MadScientist:嗯,这取决于我的 MAKEFLAGS 中是否还有其他东西,但没关系。 这是我使用 Ninja 的原因号 #289465。 POSIX shell 没有定义任何像+= 这样的操作符;使用它是一个语法错误。在保留预先存在的值的同时编写它的可移植方式是MAKEFLAGS="$MAKEFLAGS --no-print-dir"。一些 shell(如 bash)确实支持 += 作为特定的运算符,而另一些则不支持。 没有特别的理由必须打印这些行:这就是 cmake 决定生成其 makefile 的方式。 cmake 可以很容易地生成在这里做得更好的 makefile,而且我确信 cmake 可以(甚至可以)生成不能完全按照某些人想要的方式工作的 ninja 文件。 【参考方案1】:

你会发现自己没有办法做你想做的事。

由于 cmake 只是生成 makefile,实际上是 make 运行配方并打印输出,因此您需要查看 makefile 并了解规则是如何构建的。例如,如果您找到链接线的示例规则,您将看到它看起来像这样:

myexecutable: ...
        @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/mydir/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Linking CXX executable myexecutable"
        cd /mydir && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/myexecutable.dir/link.txt --verbose=$(VERBOSE)

请注意,此配方中 cd /mydir ... 文本之前没有特殊变量、标记或任何内容。

因此,绝对没有办法控制这个特定配方的打印方式,与所有其他配方的打印方式分开。你要么全部得到,要么一个都得不到。

【讨论】:

以上是关于使用cmake/make打包Android 动态库的主要内容,如果未能解决你的问题,请参考以下文章

androidstudio如何执行makeinstall

使用CMake编译C/C++程序

./configure,make,make install的作用

gnuradio 打包脚本

make如何指定cmake路径

在Android上部署深度学习模型之CMakeLists文件