Cmake使用摘要

Cmake使用常识

  • Cmake设置变量

    与我们平时的编程语言不同,并不是如int a = 1这样设置的。

    Cmake中全部的操作都是通过调用方法来设置的。

    如设置一个变量DIR = “/dir/abc”,应该是使用SET方法

    set(DIR /dir/abc)

  • Cmake命令不区分大小写,变量区分大小写

  • Cmake中所有的变量都是字符串,所以加不加引号都是一样的

    set(DIR /dir/abc)set(DIR “/dir/abc”)是一样的。只有当变量的值存在空格的时候引号才是必要的。

    例如set(DIR "/dir/a b"),这里a b是一个文件,这个文件名中间有一个空格,如果这里不加引号,cmake将识别错误

  • Cmake的注释

    使用#进行注释,只有单行注释没有多行注释

  • Cmake的变量引用

    与shell脚本差不多,使用${var}进行变量引用。

  • Cmake必须由cmake_minimum_required(VERSION 3.4.1)这句开头

    版本号根据实际需要来即可

  • Cmake编译流程

    按编译流程来说,Cmake完成的任务就是

    • 设置头文件目录
    • 设置库文件目录
    • 找到库文件
    • 编译库文件
    • 链接库文件
    • ...

    所以不是很难,不需要担心,理清楚这几个,再注意一些细节即可(高级用法除外)

Cmake使用要点

  • Cmake常用命令

    #设置cmake版本,必须放在第一行,版本按自己需要设置即可。
    #这里的版本号3.4.1,实际是字符串
    cmake_minimum_required(VERSION 3.4.1)
    #设置变量,将abcdefg设置给VAR
    set(VAR abcdefg)
    #打印日志
    message(STATUS "this print a message")
    #添加一个library,将源码编译为指定的库
    add_library( 
            native-lib
            SHARED
            native-lib.cpp)
    #通过添加三方库,来添加一个library。这里,add_library要与set_target_properties一起使用
    add_library(third_party_lib   SHARED IMPORTED)
    set_target_properties(third_party_lib
                          PROPERTIES IMPORTED_LOCATION
                          xxx/libthird_party_lib.so)
    #添加文件路径
    include_directories(/dir/includes)
    #添加库文件路径
    link_directories()
    #将库文件链接到一起
    target_link_libraries(
                          my_lib
                          lib1
                          lib2
                          ...
    )
    
  • Cmake常用变量

    #CmakeLists.txt所在的路径
    message(STATUS ${CMAKE_SOURCE_DIR}) 
    #ANDROID ABI
    message(STATUS ${ANDROID_ABI}) 
    

FFMpeg配置共享

cmake_minimum_required(VERSION 3.4.1)

#使用file列出所有的.cpp文件作为source files,
#需要注意使用这个方法后,无论源文件是否有添加或删除,CMakeLists.txt文件不会变化,则cmake无法检测,
#所以如果源文件有变化需要手动来改一下CMakeLists.txt,使cmake探测变化.
file(GLOB source_files *.cpp)
add_library(native-lib SHARED ${source_files})

#添加头文件路径
set(include_dir ${CMAKE_CURRENT_SOURCE_DIR}/ffmpeg)
message("** include dir is ${include_dir}")
include_directories(${include_dir})

#设置so文件路径
set(so_dir ${PROJECT_SOURCE_DIR}/../jniLibs/armeabi-v7a)
message("** project source dir is ${so_dir}")
#导入so库, 并将lib名添加到lib_name_list里面
file(GLOB so_files ${so_dir}/*.so)
foreach (so_file_path ${so_files})
    string(REGEX REPLACE ".+/(.+)\\..*" "\\1" lib_name ${so_file_path})
    message("** lib name : ${lib_name}, path : ${so_file_path}")
    list(APPEND lib_name_list ${lib_name})
    add_library(${lib_name} SHARED IMPORTED)
    set_target_properties(${lib_name} PROPERTIES IMPORTED_LOCATION ${so_file_path})
endforeach ()

#链接
#################注意##################
# find_library ( name1 [path1 path2 ...])
# add_library( [STATIC | SHARED | MODULE][EXCLUDE_FROM_ALL][source1] [source2 ...])
# find_library后面跟的是变量,所以下面要使用 ${log-lib}
# add_library后面跟的是name,不是一个变量,所以一定不能写成${native-lib},否则会报错
#######################################
find_library(log-lib log)
target_link_libraries(
        native-lib
        ${lib_name_list}
        ${log-lib}
)

你可能感兴趣的:(Cmake使用摘要)