美文网首页
编译原理与语法(六)——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