1、.cpp、.h、.c文件的区别
1、.cpp和.h文件的由来
编译器编译代码的时候首先先编译各模块,然后再将各模块链接为最终的可执行程序
一般来说,一个文件就编译为一个模块
但是,各模块要能链接到一起,必须有一些共同的地方,例如模块A里面有一个函数,模块B想要使用这个函数,它就必须知道模块A的一些信息才行。体现在代码上,就是有些代码必须在几个文件里都写一遍
此时我们将这样的代码写在一个单独的文本文件里,后缀名使用.h或者.hpp来表示,并使用#include来将这个文件里面的代码包含到需要这段代码的.cpp文件中
后者是本质,前者是工具。模块内的执行代码,写在.cpp文件里;用于表示模块信息的代码,写在.h文件里,并被数个.cpp文件包含
.h中就是有的就是变量的定义以及函数的声明,cpp中包含的就是变量的初始化以及函数的具体实现
2、c与cpp的区别
.c 是c语言的源程序,
.cpp是c++语言的源程序,这是两种不同的语言,语法同,c++兼容c语言的绝大部分语法特性。
2、android.mk文件
android ndk的构建系统是基于GUN Make。这个构建系统的主要目的是使开发人员能够用很短的
构建文档来描述原生的android应用程序,该构建系统还处理了包括替开发人员指定工具链、平台,
CPU和ABI等很多细节。
android ndk构建系统还要依赖另外两个文件:android.mk和application.mk。这两个文件
是由开发人员提供的(application.mk可选)。
android.mk是一个向android ndk构建系统描述NDK项目的GUN Makefile片段。
它是每一个NDK项目的必备组件,构建系统希望它出现在jni子目录中
在一个入门hellondk的demo中mk .文件如下:
1、LOCAL_PATH := $(call my-dir)
用来定位源文件。因为将该变量设置硬编码并不合适,所有android构建系统提供一个名为my-dir的宏功能。通过将该变量设置为my-dir宏功能的返回值
2、include $( CLEAR_VARS)
CLEAR_VARS由编译系统提供,指定让GNU MAKEFILE为你清除许多LOCAL_XXX变量(例如 LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES, 等等…),
除LOCAL_PATH 。这是必要的,因为所有的编译控制文件都在同一个GNU MAKE执行环境中,所有的变量都是全局的。
3、LOCAL_MODULE := MyNdk
LOCAL_MODULE变量必须定义,以标识你在Android.mk文件中描述的每个模块。名称必须是唯一的,而且不包含任何空格。注意编译系统会自动产生合适的前缀和后缀,换句话说,一个被命名为’MyNdk’的共享库模块,将会生成’libMyNdk.so’文件。
重要注意事项
如果你把库命名为‘libhelloworld’,编译系统将不会添加任何的lib前缀,也会生成libhelloworld.so,这是为了支持来源于Android平台的源代码的Android.mk文件,如果你确实需要这么做的话。
LOCAL_SRC_FILES := helloworld.c
LOCAL_SRC_FILES变量必须包含将要编译打包进模块中的C或C++源代码文件。注意,你不用在这里列出头文件和包含文件,因为编译系统将会自动为你找出依赖型的文件;仅仅列出直接传递给编译器的源代码文件就好。【注意,默认的C++源码文件的扩展名是’.cpp’. 指定一个不同的扩展名也是可能的,只要定义LOCAL_DEFAULT_CPP_EXTENSION变量,不要忘记开始的小圆点(也就是定义为‘.cxx’,而不是‘cxx’)(当然这一步我们一般不会去改它)】
4、include $(BUILD_SHARED_LIBRARY)
BUILD_SHARED_LIBRARY是编译系统提供的变量,指向一个GNU Makefile脚本(应该就是在build/core目录下的shared_library.mk),负责收集自从上次调用’include $(CLEAR_VARS)’以来,定义在LOCAL_XXX变量中的所有信息,并且决定编译什么样的库
3、静态库,动态库,共享库
1、静态库
include $(BUILD_STATIC_LIBRARY)
这类库的名字一般是libxxx.a;利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译。
2、动态库
include $(BUILD_EXECUTABLE)
动态加载库(dynamically loaded (DL) libraries)是指在程序运行过程中可以加载的函数库。而不是像共享库一样在程序启动的时候加载。DL对于实现插件和模块非常有用,因为他们可以让程序在允许时等待插件的加载。在Linux中,动态库的文件格式跟共享库没有区别,主要区别在于共享库是运行时加载。
有专门的一组API用于完成打开动态库,查找符号,处理出错,关闭动态库等功能。
3、共享库
include $(BUILD_SHARED_LIBRARY)
这类库的名字一般是libxxx.so;相对于静态函数库,动态函数库在编译的时候 并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。