1、 CMakeLists.txt参数详解
AndroidStudio之NDK开发CMake CMakeLists.txt编写入门_江西省遂川县杰出青年代表的博客-CSDN博客
2、CMakeList初步了解,及过程
AndroidStudio CMakeList的总结 - 简书
https://www.cnblogs.com/wangjian8888/articles/10710690.html
4、cmake常用的变量
5、其他参考文章
AndroidStudio CMakeList的总结 - 简书
6、编译库类型
add_library(<name> [STATIC | SHARED | MODULE]
[EXCLUDE_FROM_ALL]
[<source>...])
静态库(.a、.lib):编译应用程序就将代码编译进去,跟自己的代码无区别。STATIC
官方解释:STATIC
libraries are archives of object files for use when linking other targets
动态库(.so、.dll):编译应用程序时没有引入,执行时才将将动态库加载到内存中。SHARED
官方解释:libraries are linked dynamically and loaded at runtime
MODULE:
官方解释:MODULE
libraries are plugins that are not linked into other targets but may be loaded dynamically at runtime using dlopen-like functionality
add_library(<name> OBJECT [<source>...])
OBJECT:
官方解释:An object library compiles source files but does not archive or link their object files into a library.
8、若出现"undefined reference to XXX"错误,
1、有可能是没有引入对应的.h或者.cc文件,此时如果在报错地方可以跳转到缺失的引用,有可能是CMakeLists.txt文件没有引入对应的.h或者.cc。
2、在C++中编译C,及在.cc中包含.c,也就是在.cc对应的.h头文件中包含了.c对应的头文件,也或许是.cc中包含了.c对应的.h头文件或者.c,导致编译报错,这时需要在加载.c头文件的地方加入extern "C"{ }
例如:audio_file_decoder.h对应的是audio_file_decoder.cc,这时audio_file_decoder.h引入了frame.c对应的frame.h文件,就需要这样处理:
extern "C"{
#include "/ffmpeg/include/libavutil/frame.h"
}
9、出现android NativeLibrary: java.lang.UnsatisfiedLinkError: dlopen failed: library "libavutil.so" not found
在cmakelists中,通过target_link_libraries 链接其他.so,例如链接x.so,如出现这样的错误,说明x.so未被打包进入apk中,这时需要将.so按照gradle编译脚本要求,放到jniLibs文件中,这样再编译就没有问题了。