美文网首页
编译原理与语法(六)——CMakeLists.txt详解

编译原理与语法(六)——CMakeLists.txt详解

作者: 王志强_9380 | 来源:发表于2019-10-10 17:09 被阅读0次
    cmake_minimum_required(VERSION 3.4.1)
    
    add_library( 
                 native-lib
                 SHARED
                 native-lib.cpp )
    
    find_library( 
                  log-lib
                  log )
    
    target_link_libraries( 
                           native-lib
                           ${log-lib} )
    

    常用命令

    cmake_minimum_required(VERSION 3.4.1)

    指定cmake最低支持的版本,可以省略

    aux_source_directory(. DIR_SRCS)

    • 查找当前目录所有源文件,并将源文件名称列表保存到DIR_SRCS变量
    • 不能查找子目录
    • 第一次参数:指定查找的目录
    • 第二个参数:保存列表的变量

    add_library

    添加一个库
    add_library(name
                STATIC|SHARED|MODULE
                EXCLUDE_FROM_ALL
                source1 source2 ... sourceN)
    
    add_library( 
                 native-lib
                 SHARED
                 native-lib.cpp )
    
    
    • 添加一个库文件,名字为name
    • 指定库的类型。STATIC:静态库;SHARED:动态库;MODULE:在使用dyld系统有效,否则等同于SHARED
    • EXCLUDE_FROM_ALL:表示该库不会被默认构建
    • source1 source2 ... sourceN 指定库的源文件
    导入预编译库
    add_library(name
                STATIC|SHARED|MODULE|UNKNOWN
                IMPORTED
            )
    
    add_library(test
                SHARED
                IMPORTED
            )
    set_target_properties(
                test #指明目标库名
                PROPERTIES IMPRORTED_LOCATION #指明要设置的参数库路径/${ANDROID_ABI}/
                libtest.so #导入库的路径
    )
    

    set 设置变量

    • set(EXECUTABLE_OUTPUT_PATH [output_path])
      设置可执行文件的输出路径,EXECUTABLE_OUTPUT_PATH 是全局变量
    • set(LIBRARY_OUTPUT_PATH [output_path])
      设置库文件的输出路径,LIBRARY_OUTPUT_PATH 是全局变量
    • set(CMAKE_CXX_FLAGS "-Wall sta=c++11")
      设置C++编译参数,CMAKE_CXX_FLAGS 是全局变量
    • set(SOURCE_FILES main.cpp test.cpp ...)
      设置源文件集合,SOURCE_FILES 是本地变量

    include_directories

    include_directories(./include ${MY_INCLUDE})

    • 设置头文件目录
    • 相当于g++选项中的-l参数
      -可以用相对或绝对路径,也可以使用自定义变量

    add_executable

    add_executable(name $(SRC_LIST))
    添加可执行文件

    target_link_libraries

    target_link_libraries(name lib1 lib2 lib3)

    • 将若干库链接到目标库文件
    • 链接顺序应当符合gcc链接顺序规则,被链接库放在依赖它的库后面,如lib1依赖于lib2,lib2依赖于lib3,那么上诉命令必须按照lib1 lib2 lib3排列
    • 如果出现相互依赖的静态库,CMake会允许依赖图中包含循环依赖如
    add_library(A STATIC a.c)
    add_library(B STATIC b.c)
    target_link_libraries(A B)
    target_link_libraries(B A)
    add_executable(main main.c)
    target_link_libraries(main A)
    

    add_definitions

    add_definitions(-DF00 -DDEBUG ...)
    为当前路径以及子目录的源文件加入由-D引入的define flag

    add_subdirectory

    add_subdirectory(sub_dir [binary_dir])

    • 如果当前目录下还有子目录时,可以使用add_subdirectory,子目录中也需要包含CMakeLists.txt
    • sub_dir指定包含CMakeLists.txt和源码文件的子目录位置
    • binary_dir输出路径,一般可以不指定

    set_directory_properties

    set_directory_properties(PROPERTIES prop1 value1 prop2 value2)

    • 设置某个路径的一种属性
    • prop1 prop2代表属性:
      INCLUDE_DIRECTORIES
      LINK_DIRECTORIES
      INCLUDE_REGULAR_EXPRESSION
      ADDITIONAL_MAKE_CLEAN_FILES

    set_property

    set_property(<GLOBAL |
            DIRECTORY [dir] |
            TARGET [target1 [target2 ...]] |
            SOURCE [src1 [src2 ...]] |
            TEST [test1 [test2 ...]] |
            CACHE [entry1 [entry2 ...]]>
            [APPEND][APPEND_STRING]
            PROPERTY <name>[value1 [value2 ...]])
    
    • 在给定的作用域内设置一个命名的属性
    • PROPERTY 参数是必须的
    • 第一个参数决定了属性可以影响的作用域
      GLOBAL:全局作用域
      DIRECTORY:默认当前路径,也可以用[dir]指定路径
      TARGET:目标作用域,可以是0个或多个已有目标
      SOURCE:源文件作用域,可以是0个或多个源文件
      TEST:测试作用域,可以是0个或多个
      CACHE:必须指定0个或多个cache中已有的条目

    find_library

    find_library( 
            log-lib
            log)
    

    查找系统库,这里查找的是系统日志库,并赋值给变量log-lib.
    目录位置:ndk-bundle\platforms\android-21\arch-arm\usr\lib\liblog.so

    多个源文件处理

    aux_source_directory(. DIR_SRCS)
    # file(GLOB DIR_SRCS *.c *.cpp)
    add_library(
            native-lib
            SHARED
            ${DIR_SRCS})
    

    使用aux_source_directory或者file命令查找指定目录下所有源文件,存进指定的变量DIR_SRCS

    多目录多个源文件处理

    aux_source_directory(. DIR_SRCS)
    add_subdirectory(child)
    add_library(
            native-lib
            SHARED
            ${DIR_SRCS})
    target_link_libraries(native-lib child)
    
    -------------------------------------------------------
    #child目录与下的CMakeLists.txt
    aux_source_directory(. DIR_LIB_SRCS)
    add_library(
            child
            SHARED
            ${DIR_LIB_SRCS})
    
    • add_subdirectory(child)指明本项目包含一个子项目child
    • target_link_libraries(native-lib child)指明本项目需要链接一个名为child的库

    添加预编译库

    add_library(
            imported-lib
            SHARED
            IMPORTED )
    set_target_properties(
            imported-lib
            PROPERTIES
            IMPORTED_LOCATION 
            路径/libimported-lib.so)
    aux_source_directory(. DIR_SRCS)
    add_library(
            native-lib
            SHARED
            ${DIR_SRCS})
    target_link_libraries(native-lib imported-lib)
    
    • add_library命令,第一个参数是模块名,第二个参数表示是动态库,第三个参数IMPORTED表示以导入的形式添加
    • set_target_properties设置导入路径属性。参数分别是:库、属性、导入地址、库所在地址
    • target_link_libraries表示native-lib需要链接imported-lib

    Android6.0以上使用set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -L[SO所在目录]")

    • CMAKE_C_FLAGS :c的参数,会传递给编译器
    • 如果是c++文件,需要使用CMAKE_CXX_FLAGS
    • -L:库的查找路径

    添加头文件目录

    include_directories(文件目录)
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}" -L[SO所在目录])
    aux_source_directory(. DIR_SRCS)
    add_library(
            native-lib
            SHARED
            ${DIR_SRCS})
    target_link_libraries(native-lib imported-lib)
    

    相关文章

      网友评论

          本文标题:编译原理与语法(六)——CMakeLists.txt详解

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