赞
踩
CMakeLists.txt
文件的时候不可能将项目目录的各个文件一一罗列出来,这样太麻烦也不现实aux_source_directory
命令或者file
命令aux_source_directory
命令可以查找某个路径下的所有源文件dir
:要搜索的目录variable
:将从dir
目录下搜索到的源文件列表存储到该变量中aux_source_directory(< dir > < variable >)
aux_source_directory(${PROJECT_SOURCE_DIR}/src SRC)
GLOB
:将指定目录下搜索到的满足条件的所有文件名生成一个列表,并将其存储到变量中GLOB_RECURSE
:递归搜索指定目录,将搜索到的满足条件的文件名生成一个列表,并将其存储到变量中file(GLOB/GLOB_RECURSE 变量名 要搜索的文件路径和文件类型)
file(GLOB MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
CMAKE_CURRENT_SOURCE_DIR
宏表示当前访问的CMakeLists.txt
文件所在的路径include_directories
即可include_directories(<directory1> [<directory2> ...])
file
命令对各个目录下的源文件进行搜索,最后还需要做一个字符串拼接的操作set
命令也可以使用list
命令set(变量名1 ${变量名1} ${变量名2} ...)
cmake_minimum_required(VERSION 3.0)
project(TEST)
set(TEMP "DieSnowK")
file(GLOB SRC_1 ${PROJECT_SOURCE_DIR}/src1/*.cpp)
file(GLOB SRC_2 ${PROJECT_SOURCE_DIR}/src2/*.cpp)
# 追加(拼接)
set(SRC_1 ${SRC_1} ${SRC_2} ${TEMP})
message(STATUS "message: ${SRC_1}")
list
命令的功能比set
要强大,字符串拼接只是它的其中一个功能,所以需要在它第一个参数的位置指定出要做的操作,APPEND
表示进行数据追加,后边的参数和set
就一样了list(APPEND <list> [<element> ...])
cmake_minimum_required(VERSION 3.0)
project(TEST)
set(TEMP "DieSnowK")
file(GLOB SRC_1 ${PROJECT_SOURCE_DIR}/src1/*.cpp)
file(GLOB SRC_2 ${PROJECT_SOURCE_DIR}/src2/*.cpp)
# 追加(拼接)
list(APPEND SRC_1 ${SRC_1} ${SRC_2} ${TEMP})
message(STATUS "message: ${SRC_1}")
set
命令可以创建一个list
,一个在list
内部是一个由分号;
分割的一组字符串
set(var a b c d e)
命令将会创建一个list:a;b;c;d;e
,但是最终打印变量值的时候得到的是abcde
set(tmp1 a;b;c;d;e)
set(tmp2 a b c d e)
message(${tmp1}) # 输出结果 abcde
message(${tmp2}) # 输出结果 abcde
file
搜索某个目录就得到了该目录下所有的源文件,但是其中有些源文件并不是所需要的,需要从搜索到的数据中剔除出去,想要实现这个功能,也可以使用list
REMOVE_ITEM
list(REMOVE_ITEM <list> <value> [<value> ...])
file
命令搜索源文件的时候得到的是文件的绝对路径(在list
中每个文件对应的路径都是一个item
,并且都是绝对路径),那么在移除的时候也要将该文件的绝对路径指定出来才可以,否是移除操作不会成功cmake_minimum_required(VERSION 3.0)
project(TEST)
file(GLOB SRC_1 ${PROJECT_SOURCE_DIR}/*.cpp)
# 移除前日志
message(STATUS "message: ${SRC_1}")
# 移除 main.cpp
list(REMOVE_ITEM SRC_1 ${PROJECT_SOURCE_DIR}/main.cpp)
# 移除后日志
message(STATUS "message: ${SRC_1}")
list
的长度
list(LENGTH <list> <output variable>)
LENGTH
:子命令LENGTH
用于读取列表长度<list>
:当前操作的列表<output variable>
:新创建的变量,用于存储列表的长度list(GET <list> <element index> [<element index> ...] <output variable>)
<list>
:当前操作的列表<element index
:列表元素的索引
-1
表示列表的最后一个元素,-2
表示列表倒数第二个元素,以此类推<output variable>
:新创建的变量,存储指定索引元素的返回结果,也是一个列表list (JOIN <list> <glue> <output variable>)
<list>
:当前操作的列表<glue>
:指定的连接符(字符串)<output variable>
:新创建的变量,存储返回的字符串list(FIND <list> <value> <output variable>)
<list>
:当前操作的列表<value>
:需要在列表中搜索的元素<output variable>
:新创建的变量
<list>
中存在<value>
,那么返回<value>
在列表中的索引list (APPEND <list> [<element> ...])
list
中指定的位置插入若干元素list(INSERT <list> <element_index> <element> [<element> ...])
list (PREPEND <list> [<element> ...])
list (POP_BACK <list> [<out-var>...])
list (POP_FRONT <list> [<out-var>...])
list (REMOVE_ITEM <list> <value> [<value> ...])
list (REMOVE_AT <list> <index> [<index> ...])
list (REMOVE_DUPLICATES <list>)
list(REVERSE <list>)
list (SORT <list> [COMPARE <compare>] [CASE <case>] [ORDER <order>])
COMPARE
:指定排序方法
STRING
:按照字典序排序,为默认的排序方法FILE_BASENAME
:如果是一系列路径名,会使用basename
进行排序NATURAL
:使用自然数顺序排序CASE
:指明是否大小写铭感
SENSITIVE
:按照大小写敏感的方式进行排序,为默认值INSENSITIVE
:按照大小写不敏感的方式进行排序ORDER
:指明排序的顺序
ASCENDING
:按照升序排序,为默认值DESCENDING
:按照降序排列#include <stdio.h>
#define NUMBER 3
int main()
{
int a = 10;
#ifdef DEBUG
printf("Pikachu~\n");
#endif
for(int i=0; i<NUMBER; ++i)
{
printf("DieSnowK\n");
}
return 0;
}
-D
指定出要定义的宏的名字,这样就相当于在代码中定义了一个宏,其名字为DEBUG
gcc test.c -DDEBUG -o app
add_definitions
add_definitions(-D宏名称)
cmake_minimum_required(VERSION 3.0)
project(test)
add_definitions(-DDEBUG)
add_executable(app ./main.c)
以下为CMake中常用的一些预定义宏
宏 | 功能 |
---|---|
PROJECT_SOURCE_DIR | 使用cmake 命令后紧跟的目录,一般是工程的根目录 |
PROJECT_BINARY_DIR | 执行cmake 命令的目录 |
CMAKE_CURRENT_SOURCE_DIR | 当前处理的CMakeLists.txt 所在的路径 |
CMAKE_CURRENT_BINARY_DIR | target 编译目录 |
EXECUTABLE_OUTPUT_PATH | 重新定义目标二进制可执行文件的存放位置 |
LIBRARY_OUTPUT_PATH | 重新定义目标链接库文件的存放位置 |
PROJECT_NAME | 返回通过PROJECT 指令定义的项目名称 |
CMAKE_BINARY_DIR | 项目实际构建路径,假设在build 目录进行的构建,那么得到的就是这个目录的路径 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。