Android NDK开发(一):C/C++库基础知识

1  C/C++库的本质

        是编译好的C/C++的二进制代码,可以直接被CPU执行,加上头文件就可以供开发者使用。

2  C/C++库分类

        根据是否打入到依赖它的目标程序中,分为静态库和动态库。在不同操作系统上,C/C++库的后缀名如下:

windows linux Android ios
静态库 .lib .a .a .a
动态库 .dll .so .so .dylib/.tbd

3  动态库与静态库区别

(1)使用上的区别:
        静态库在编译时被链接并被打到目标程序中,由于已经在目标程序中,目标程序运行时直接在内存中使用;同一个静态库被多个程序调用时会被重复加载多次。
        动态库在运行时被链接并加载到内存中供目标程序使用,并不会打到目标程序中;同一个动态库被多个程序调用时,只加载一次。

(2)生成上的区别:
        生成静态库时只有编译过程,没有链接过程,所以当静态库依赖其他静态库或者动态库时不需要指定它需要链接的静态库或动态库,指定也没啥用;但使用该静态库时,使用方需要链接该静态库依赖的静态库或动态库,因为在可执行文件或动态库链接静态库的时候,它会去扫描该静态库中哪些未解析符号,然后会在可执行文件或动态库链接的其它静态库或动态库中去扫描看是否有此未解析的符号,如果有,则链接到此对应的定义,没有则报错。例如可执行文件z需要链接静态库a,而静态库a需要链接静态库b,那么如果可执行文件z要使用静态库a,z需要同时链接静态库a和静态库b,静态库a无需链接静态库b,实例验证请看这位同学的博客静态库依赖关系的一种情况_唐麦片的博客-CSDN博客_静态依赖
        生成动态库时既有编译过程又有链接过程,所以直接在动态库中指定需要链接的静态库或者动态库即可,当动态库链接静态库时,会把静态库复制一份打到动态库里,当动态库依赖动态库时,会根据指定路径查找,并不会将动态库代码打到动态库中,而是运行时才将依赖的动态库读入内存。

4  动态库与静态库优缺点

        静态库
                优点:
                (1)速度比动态库略快。
                (2)程序安装到同架构的其他设备上方便。
                缺点:
                (1)程序体积大:静态库打进目标程序,导致程序体积大;
                (2)浪费内存:多个使用同一个静态库的程序同时运行时,多个相同静态库的副本会重
                        复加载到内存中,浪费内存。
                (3)更新麻烦:更新库时,需要重新编译整个程序。
        动态库
                优点:

                (1)程序体积小:动态库在程序运行时动态链接载入内存,库文件不打进目标程序,二
                        者序相互独立,因此程序体积较小;
                (2)节省内存:多个使用同一个动态库的程序同时运行时,只需要加载一个动态库到内
                        存,节省内存。
                (3)更新方便:更新库时,不需要重新编译整个程序,只需要更新库文件。
                缺点:
                (1)速度比静态库略慢
                (2)程序安装到同架构的其他设备上略麻烦,需要先把动态库移植过去,然后再安装程
                        序,保证程序运行时不会出错。

5  C/C++库编译

(1)C/C++文件的编译流程如下:

Android NDK开发(一):C/C++库基础知识_第1张图片

        预处理:读取c源程序,对其中的伪指令(以# 开头的指令)和特殊符号进行处理。
        编译:通过词法分析和语法分析,在确认所有的指令都符合语法规则之后,将其翻译成汇编代码,并优化;其中优化主要包括去冗余、合理使用硬件资源等。
        汇编:把汇编语言代码翻译成目标机器指令,每一个C语言源文件,都将最终经过这一处理而得到相应的目标文件。
        链接:将目标文件和库文件生成可执行程序或者动态库。由汇编程序生成的目标文件并不能立即就被执行,可能引用了其他库的符号函数等等,这就需要链接这个库,链接包括静态链接和动态链接,链接的库是静态库就是静态链接,链接的库是动态库就是动态链接;静态链接是将静态库复制一份到最终的可执行文件中,动态链接只在最终的可执行程序中记录下共享对象的名字以及其它少量的登记信息,在此可执行文件被执行时,动态链接库的全部内容将被映射到运行时相应进程的虚地址空间。
        归档:将目标文件打包成静态库,静态库实际上就是目标文件的集合,没有链接过程。

(2)将C/C++代码编译成库,需要编译器、标准库及第三方库。不同的操作系统都有自己的编译器及相应的标准库,目前常用编译器如下:

编译器 标准库
Linux系统 gcc/g++ libstdc++(gnustl)
Android/MAC OS 系统 clang/clang++配合llvm libc++
Windows cl.exe STL

        其中C++标准库是包含C标准库的,不同平台用自己的编译器及标准库是最好的,也可以不用自己的,但可能会出现很多兼容问题。Android平台NDK r18开始弃用了gcc转而全面支持clang。windows的C/C++编译基本集成在VS开发环境中,很少单独使用。
        另外编译器也可以跨平台使用,相关知识请看这位同学的文章C/C++的编译器|编译环境(非常全面的比较) - bestsarah - 博客园

6  几点注意

        (1)库中不包括头文件,只有源文件的二进制形式,使用时需要将头文件和库文件配套使用

 好了分享就到这里,如有问题请告知,希望大家点个赞支持一下!!!

你可能感兴趣的:(android,ndk,android,java,android,studio,flutter)