linux下使用cmake交叉编译Android可以使用的动态库
一、使用Cmake编译生成so库
要求:用cmake编译生成so库。
目录列表如下:
- include: 存放头文件的。
- hello.h: 头文件,下面是头文件的内容
#ifndef HELLO_H #define HELLO_H #include <stdio.h> void HelloFunc(); #endif
- lib: 用来存放编译生成的so目录
- src: 源文件存放目录
- hello.c: 源文件,下面是源文件的内容
#include “hello.h” void HelloFunc(){ printf(“Hello World\n”); }
- build: 外部编译目录
- CMakeLists.txt:
目录如上,那么我们应该怎么去写CMakeLists.txt呢?
主要分为以下几个步骤:
- 1、定义好Cmake编译版本
- 2、定义一个项目名
- 3、指定头文件的目录
- 4、后指定源文件目录
- 5、指定生成so生成目录
- 6、指定生成动态库
1、定义好Cmake编译版本
CMAKE_MINIMUM_REQUIRED(VERSION 3.14)
2、定义一个项目名
PROJECT (HELLO)
3、指定头文件的目录
INCLUDE_DIRECTORIES (${PROJECT_SOURCE_DIR}/include)
PROJECT_SOURCE_DIR:工程的顶层目录
4、后指定源文件目录
这个有几种指定方式:
-
使用 AUX_SOURCE_DIRECTORY 指令
AUX_SOURCE_DIRECTORY (${PROJECT_SOURCE_DIR}/src SRC_LISTS)
SRC_LISTS: 代表 src 目录下的所有源文件,自定义的名字
-
使用 FILE 指令
FILE(GLOB SRC_LISTS_CPP "${PROJECT_SOURCE_DIR}/src/*.cpp" "${PROJECT_SOURCE_DIR}/src/*.c")
也可以分开写
FILE(GLOB SRC_LISTS_CPP "${PROJECT_SOURCE_DIR}/src/*.cpp") FILE(GLOB SRC_LISTS_C "${PROJECT_SOURCE_DIR}/src/*.c")
5、指定生成so生成目录
SET (LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
6、指定生成动态库
ADD_LIBRARY (hello SHARED ${SRC_LISTS_CPP} ${SRC_LISTS_C})
编写好CmakeList.txt文件之后,具体指令如下。
cd build
cmake ..
make
好了,到这so库就生成好了。当然这个so只能在linux上使用,是无法在andrid上使用的如果想要在android上使用,需要用到ndk交叉编译。至于交叉编译能够在android上使用的so库,咱们下一章再讲。
现在,先讲解一下在linux上怎么使用这个so库。
二、链接外部动态库与头文件
上面说了生成动态库的步骤,那生成好的动态库怎么去使用呢?
当我们要使用生成好的so动态库的时候,也需要之前生成动态库的头文件,头文件不要忘了。
新建工程目录,目录列表如下:
- include: 存放头文件的。
- hello.h: 这个头文件,就是上面生成动态库时的头文件
#ifndef HELLO_H #define HELLO_H #include <stdio.h> void HelloFunc(); #endif
- lib: 用来存放编译生成的so目录
- hello.so: 上面生成的so动态库
- src: 源文件存放目录
- useSO.c: 源文件,下面是源文件的内容
#include "hello.h" int main(){ HelloFunc(); return 0; }
- build: 外部编译目录
- CMakeLists.txt:
上面是整个工程目录,现在就剩下怎么去编写CMakeLists.txt文件了。
编写步骤如下:
- 1、指定 CMake 的最低编译版本
- 2、定义一个项目名
- 3、指定外部so动态库需要的头文件存放目录
- 4、指定外部so动态库的存放目录
- 5、生成可执行文件
- 6、将动态库链接到执行文件中
1、定义好Cmake编译版本
CMAKE_MINIMUM_REQUIRED(VERSION 3.14)
2、定义一个项目名
PROJECT (HELLO)
3、指定外部so动态库需要的头文件存放目录
INCLUDE_DIRECTORIES (${PROJECT_SOURCE_DIR}/include)
PROJECT_SOURCE_DIR:工程的顶层目录
4、指定外部so动态库的存放目录
LINK_DIRECTORIES (${PROJECT_SOURCE_DIR}/lib)
5、生成可执行文件
ADD_EXECUTABLE (useSo ${PROJECT_SOURCE_DIR}/src/useSo.c)
6、将动态库链接到执行文件中
TARGET_LINK_LIBRARIES(useSo hello)
编写好CmakeList.txt文件之后,具体指令如下。
cd build
cmake ..
make
./useSo
当然你也可以写一个脚本来干这事,
脚本名字: use_so_build.sh
脚本内容:
rm -rf build
mkdir build
cd build
cmake ..
make
./useSo
然后直接运行脚本就可以了
./use_so_build.sh