美文网首页
Cmake使用摘要

Cmake使用摘要

作者: sam寨 | 来源:发表于2020-02-14 15:26 被阅读0次

    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 (<VAR> name1 [path1 path2 ...])
    # add_library(<name> [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使用摘要

          本文链接:https://www.haomeiwen.com/subject/nsxvjctx.html