音视频:09.Cmake语法-详解CmakeLists.txt

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}):生成可执行文件
  1. 新建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})
  2. 在同目录下创建 build 文件夹,进入执行 cmake .. ..代表CMakeLists.txt在上一级目录

  3. 最后在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_LIST
  • FILE(GLOB SRC_LIST "${PROJECT_SOURCE_DIR}/src/*"):搜集 src 目录下的所有源文件,并赋值为SRC_LIST
  • INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include):指定头文件在哪个目录
  • SET (LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib):指定 so 的生成目录 lib
  • ADD_LIBRARY (math SHARED ${SRC_LIST_CPP} ${SRC_LIST_C}):指定生成动态库 .so, math 生成的so名字为 libmath.so 如果默认生成的是静态库.a,加入SHARED才会生成动态库.so
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 指定 CMake 的最低编译版本
CMAKE_MINIMUM_REQUIRED(VERSION 3.14)

# 给工程取名字
PROJECT(MATH)

# 搜集 src 目录下的所有源文件,有AUX_SOURCE_DIRECTORY和FILE 两种方式
# AUX_SOURCE_DIRECTORY(${PROJECT_SOURCE_DIR}/src SRC_LIST)
# FILE(GLOB SRC_LIST "${PROJECT_SOURCE_DIR}/src/*.cpp" "${PROJECT_SOURCE_DIR}/src/*.c")
FILE(GLOB SRC_LIST_CPP "${PROJECT_SOURCE_DIR}/src/*.cpp")
FILE(GLOB SRC_LIST_C "${PROJECT_SOURCE_DIR}/src/*.c")

# MESSAGE (STATUS "src_list : "${SRC_LIST})

# 指定头文件在哪个目录
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include)

# 指定 so 的生成目录 lib
SET (LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

# 指定生成动态库 .so math -> libmath.so 如果默认生成的是静态库.a,加入SHARED才会生成动态库.so
ADD_LIBRARY (math SHARED ${SRC_LIST_CPP} ${SRC_LIST_C})

3.链接外部动态库与头文件

  • LINK_DIRECTORIES (${PROJECT_SOURCE_DIR}/lib)官方不推荐使用,有时候会找不到引用。经过尝试,so库放在jniLibs下的时候可以编译成功链接 lib 目录下的 libmath.so,指定 so 在哪个目录下,
  • TARGET_LINK_LIBRARIES (hello math):为 hello 添加编译链接库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 指定 CMake 的最低编译版本
CMAKE_MINIMUM_REQUIRED(VERSION 3.14)

# ...
PROJECT (HELLO)

# 指定头文件在哪个目录
INCLUDE_DIRECTORIES (${PROJECT_SOURCE_DIR}/include)

# 编译是需要链接 lib 目录下的 libmath.so
# 指定 so 在哪个目录下,so库放在jniLibs下的时候才可以编译成功
LINK_DIRECTORIES (${PROJECT_SOURCE_DIR}/lib)

# 生成可执行文件
ADD_EXECUTABLE (hello hello.cpp)

# 为 hello 添加编译链接库
TARGET_LINK_LIBRARIES (hello math)

4. 根据不同的源文件夹生成不同的 .so 文件

1.则需要在顶层目录下创建CMakeLists.txt,内容如下

1
add_subdirectory(src)
  1. 然后在 src 中再创建一个CMakeLists.txt,内容就是上边生成.so文件的内容
  2. 在顶层目录下创建 build 文件夹,执行cmake .. ,make 的指令
  3. 如果不指定生成的so位置,最后生成的.so文件默认在build/‘源文件的目录’

5.修改以前 ffmpeg 开发项目中的 CMakeLists.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 指定最低版本名称
CMAKE_MINIMUM_REQUIRED(VERSION 3.4.1)

# 指定引入头文件目录
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src/main/jniLibs/include)
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src/main/jniLibs/other)

# 指定共享库的库目录,so库放在jniLibs下的时候才可以编译成功
LINK_DIRECTORIES(${CMAKE_SOURCE_DIR}/src/main/jniLibs/armeabi)

# 指定源文件的目录
AUX_SOURCE_DIRECTORY(${CMAKE_SOURCE_DIR}/src/main/cpp SRC_LIST)

# 生成 native-lib
ADD_LIBRARY(native-lib SHARED ${SRC_LIST})

# 为 native-lib 添加 ffmpeg 编译链接库
TARGET_LINK_LIBRARIES(native-lib
avcodec-56
avdevice-56
avfilter-5
avformat-56
avutil-54
postproc-53
swresample-1
swscale-3
-landroid
-llog)
-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!
0%