CMakeLists 常用语法

510 阅读4分钟

CMakeLists.txt简析


#指定cmake最低支持版本(可选,但是高版本特有就必须制定)
cmake_minimum_required(VERSION 3.4.1)

#查找当前目录所有源文件,并将源文件名称列表保存到DIR_SRCS
#不能查找子目录
#第一个参数为源文件目录,后一个参数保存源文件名称
aux_source_directory(. DIR_SRCS)
 
add_library( 
        native-lib
        SHARED
        native-lib.cpp)

find_library(
        log-lib
        log)
        
target_link_libraries(
        native-lib
        ${log-lib})

常用命令add_library

aux_source_directory(. DIR_SRCS)

查找当前目录所有源文件,并将源文件名称列表保存到DIR_SRCS

不能查找子目录

第一个参数为源文件目录,后一个参数保存源 文件名称

添加一个库

1.添加库文件,名为

2.指定库类型,

  • STATIC 静态库
  • SHAERD 动态库
  • MODULE 在使用dydl的系统有效,若不支持dydl等同于SHARED

3.EXCLUDE_FROM_ALL 表示该库不会被默认构建

4.source1 。。。 用来指定库的源文件

add_library(<name> 类型 是否构建所有 库文件)
#注意:中间的空格

导入预编译库

1.添加一个已存在的预编译库,名为

2.一般配合set_target_properties使用

add_library(<name> 库类型 IMPORTED)
#库类型有:SHARED STATIC MODULE UNKUOWN

#比如
add_library(test SHARED IMPORTED)
#表示以导入的方式添加一个库。
 
set_target_properties(
    test #指名目标库名
    PROPERTIES IMPORTED_LOCATION #指明要设置的参数库路径
    /${ANDROID_ABI}/libtest.so
    #导入库的路径 
    
)

常用命令-set

#设置可执行文件的输出路径(EXCUTABLE_OUTPUT_PATH是全局变量)
set(EXCUTABLE_OUTPUT_PATH [output_path])

#设置库文件的输出路径(LIBRARY_OUTPUT_PATH 是全局变量)
set(LIBRARY_OUTPUT_PATH [output_path])

#设置c++编译参数(CMAKE_CXX_FLAGS是全局变量)
set(CMAKE_CXX_FLAGS "-Wall std=c++11")

#设置源文件集合(SOURCE_FILES是本地变量即自定义变量)
set(SOURCE_FILES main.cpp test.cpp ... )

常用命令-include_directories

设置头文件目录,相当于g++选项中的-I参数

#可以用相对或绝对路径,也可以用自定义的变量值
include_directories(./include ${MY_INCLUDE})

常用命令-add_executable

#添加可执行文件 
add_executable(<name> ${SRC_LIST})

常用命令-target_link_libraries

target_link_libraries(<name> 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)
#将若干库链接到目标库文件
#链接的顺序应当符合gcc链接顺序规则,被链接的库放在依赖它的库的后面,即如果上面的命令中,lib1依赖于lib2,lib2依赖于lib3,则在上面命令中必须严格按照lib1 lib2 lib3的顺序排序,否则会报错。

常用命令-add_definitions

add_definitions(-DFOO -DDEBUG ...)
#为当前路径以及子目录的源文件加入由-D引入的define flag,用于添加编译参数。

常用命令-add_subdirectory

#sub_dir指定包含CMakeLists.txt和源码文件的子目录位置

#binary_dir是输出路径,一般可以不指定
add_subdirecroty(sub_dir [binary_dir])

常用命令-file

#将message写入到filename文件中,会覆盖文件原有内容
file(WRITE filename "message")

#将message写入filename文件中,会追加在文件末尾
file(APPEND filename "message")

#将filename文件中读取内容并存储到var变量中,如果制定了numBytes和offset
#则从offset处开始最多读numBytes个字节,另外如果指定了HEX参数,则内容会以十六进制形式存储在var变量中
file(READ filename var [numBytes] [offset] [HEX])

#重命名文件
file(RENAME <oldname> <newname>)

#删除文件
file(REMOVE [file file1 ....])

#递归的执行删除文件命令,等于rm -f
file(REMOVE_RECURSE [file file1...])

#根据指定的url下载文件
#timeout超时时间,下载的状态会保存到status中,下载日志会被保存到log,sum指定所有下载文件预期的MD5值,如果指定会自动进行比对,如果不一致,则返回一个错误。
#SHOW_PROGRESS进度信息会以状态信息的形式被打印出来
file(DOWNLOAD url file [timeout] [status] [log] [sum] [show_progress])

#创建目录
file(MAKE_DIRECTORY [dir dir1 ...])

#它会把path转换为以unix的/开头的cmake风格路径,保存在result中
file(TO_CMAKE_PATH path result)

#它会吧cmake风格的路径转换为本地路径风格:window下用"\",而unix下用"/"
file(TO_NATIVE_PATH path result)

#将会为所有匹配查询表达式的文件生成一个文件list,并将改list存储进变量variable里,如果一个表达式指定了path,返回的结果里将会是相对于给定路径的相对路径,查询表达式例子*.cxx,*.vt
#NOTE:按照官方文档的说法,不建议使用fileGLOB指令来收集工程的源文件
file(GLOB variable [path] [globbing expressions] ...)
#注意:直接添加新文件会报错,cmake不会重新生成,需要改动下cmake文件(例如添加一个空格)

常用命令-set_directory_properties

  • 设置某个路径的一种属性
  • prop1,prop2代表属性
  • INCLUDE_DIRECTORIES
  • LINK_DIRECTORIES
  • INCLUDE_REGULAR_EXPRESSION
  • ADDITIONAL_MAKE_CLEAN_FILES
set_directory_properties(PROPERTIES prop1 value1 prop2 value)

常用命令-set_property

  • 在给定的作用域内设置一个命名的属性
  • PROPERTY参数是必须的
  • 第一个参数决定了属性可以影响的作用与
  • GLOBAL:全局作用域
  • DIRECTORY:当前路径,可以用[dir]制定路径
  • TARGET:目标作用域,可以时0个或多个已有的目标
  • SOURCE:源文件作用域,可以是0个或多个源文件
  • TEST:测试作用域,可以是0个或多个已有的测试
  • CACHE:必须制定0个或多个cache中已有的条目
set_property(<
            GLOBAL |
            DIRECTORY [dir] |
            TARGET [target ...] |
            SOURCE [src ...] |
            TEST [test1 ...] |
            CACHE [entry1 ...] |
            [APPEND]
            PROPERTY <name> [value ...]>)

多个源文件处理

cmake_minimum_required(VERSION 3.4.1)
#查找当前目录所有源文件,并将名称保存到DIR变量中
#不能查找子目录
aux_source_directory(. DIR)
#也可以使用
#file(GLOB DIR *.c *.cpp)

add_library(
    native-lib
    SHARED
    ${DIR})

多目录多源文件处理

cmake_minimum_required(VERSION 3.4.1)

aux_source_directory(. DIR)

#添加child子目录的cmakelist
add_subdirectory(child)

add_library(
        test
        SHARED
        ${DIR})
        
target_link_libraries(test child)

-----------------------------------
#child目录下的CMakeLists.txt:
cmake_minimum_required(VERSION 3.4.1)

aux_source_directory(. DIR)

add_library(
        child
        SHARED
        ${DIR})