1.初试 CMake 的 HelloWorld
注意:PROJECT、这些不区分大小写
,但是${HELLO_BINARY_DIR}这些,必须大写
PROJECT(HELLO)
:给工程取一个名字SET(SRC_LIST hello.cpp)
:定义一个变量MESSAGE(STATUS "this is BINARY dir "${HELLO_BINARY_DIR})
:打印ADD_EXECUTABLE(hello.out ${SRC_LIST})
:生成可执行文件
新建
CMakeLists.txt
文件,编写以下内容1
2
3
4
5
6
7
8
9
10
11
12
13# 给工程取一个名字
PROJECT(HELLO)
# 定义一个变量
SET(SRC_LIST hello.cpp)
# 打印
MESSAGE(STATUS "this is BINARY dir "${HELLO_BINARY_DIR}) // dir/home/keanu/jamin/NDK80/t1/build
MESSAGE(STATUS "this is SOURCE dir "${HELLO_SOURCE_DIR}) // dir/home/keanu/jamin/NDK80/t1
MESSAGE(STATUS "this is PROJECT_SOURCE dir "${PROJECT_SOURCE_DIR}) // dir/home/keanu/jamin/NDK80/t1
# 生成可执行文件
ADD_EXECUTABLE(hello.out ${SRC_LIST})在同目录下创建 build 文件夹,进入执行
cmake ..
..代表CMakeLists.txt在上一级目录- 最后在build目录中,执行
make
2.构建生成 .so 动态库
目的:把src里的源文件,生成libmath.so
动态库,动态库的存储路径在lib目录下
CMAKE_MINIMUM_REQUIRED(VERSION 3.14)
:指定 CMake 的最低编译版本AUX_SOURCE_DIRECTORY(${PROJECT_SOURCE_DIR}/src SRC_LIST)
:搜集 src 目录下的所有源文件,并赋值为SRC_LISTFILE(GLOB SRC_LIST "${PROJECT_SOURCE_DIR}/src/*")
:搜集 src 目录下的所有源文件,并赋值为SRC_LISTINCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include)
:指定头文件在哪个目录SET (LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
:指定 so 的生成目录 libADD_LIBRARY (math SHARED ${SRC_LIST_CPP} ${SRC_LIST_C})
:指定生成动态库 .so,math
生成的so名字为libmath.so
如果默认生成的是静态库.a,加入SHARED才会生成动态库.so
1 | # 指定 CMake 的最低编译版本 |
3.链接外部动态库与头文件
LINK_DIRECTORIES (${PROJECT_SOURCE_DIR}/lib)
:官方不推荐使用,有时候会找不到引用。经过尝试,so库放在jniLibs下的时候可以编译成功链接 lib 目录下的 libmath.so,指定 so 在哪个目录下,TARGET_LINK_LIBRARIES (hello math)
:为 hello 添加编译链接库
1 | # 指定 CMake 的最低编译版本 |
4. 根据不同的源文件夹生成不同的 .so 文件
1.则需要在顶层目录下创建CMakeLists.txt,内容如下
1
add_subdirectory(src)
- 然后在 src 中再创建一个CMakeLists.txt,内容就是上边生成.so文件的内容
- 在顶层目录下创建 build 文件夹,执行
cmake ..
,make
的指令 - 如果不指定生成的so位置,最后生成的.so文件默认在
build/‘源文件的目录’
中
5.修改以前 ffmpeg 开发项目中的 CMakeLists.txt
1 | # 指定最低版本名称 |