0%

CMake学习

最近学了CMakeList,将所有学到的知识弄到了一个文件中

还有很多没学到,但目前学的基本已经够用了

参考文章:https://subingwen.cn/cmake/CMake-primer/index.html
以及https://subingwen.cn/cmake/CMake-advanced/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
cmake_minimum_required(VERSION 3.0.0)
#[[
参考教程:https://subingwen.cn/cmake/CMake-primer/index.html
以及https://subingwen.cn/cmake/CMake-advanced/
未读:https://www.bookstack.cn/read/CMake-Cookbook/README.md
]]
#设置项目名
project(demo)
#--------------------------变量定义----------------------------------
#定义变量,对已有数据会进行覆盖
set(SRC_LIST main.cpp)
set(HEAD_PATH ${PROJECT_SOURCE_DIR}/include)
set(LIB_PATH ${PROJECT_SOURCE_DIR}/lib)
#指定cpp标准为c++ 11
# 或在执行cmake命令时指定,如`cmake .. -DCMAKE_CXX_STANDARD=11`
# set(CMAKE_CXX_STANDARD 11)
#指定cpp标准为c++ 14
# set(CMAKE_CXX_STANDARD 14)
#指定cpp标准为c++ 17
# set(CMAKE_CXX_STANDARD 17)

#指定可执行文件输出目录,projec_source_dir为执行cmake命令时后面紧跟的目录,一般为工程根目录
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR})
#指定库文件生成目录
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)


#--------------------------------------------------------------------
#----------------------------宏定义-----------------------------
#添加宏定义,即#define,-D为define指示,DEBUG为宏
add_definitions(-DDEBUG)


#----------------------------------------------------------------
#---------------------------------源文件搜索命令---------------------------------
#将目录下所有源文件添加到变量中
aux_source_directory(${PROJECT_SOURCE_DIR} SRC_LISTS)

#与上一行类似,GLOB表示仅搜索指定目录下的文件
#GLOB可换成 GLOB_RECURSE,其表示递归搜索目录下的文件,包括子目录
#CMAKE_CURRENT_LIST_DIR表示当前CMakeLists.txt所在目录
#file命令得到的是绝对路径文件!!!!!!!!!!!!!!!!!!!!!
file(GLOB SRC_LIST_FILES ${CMAKE_CURRENT_LIST_DIR}/src/*.cpp)
# file(GLOB SRC_LIST_FILES ${CMAKE_CURRENT_LIST_DIR}/include/*.h)

#变量拼接,可使用set命令,`set(SRC_LIST ${SRC_LIST} ${SRC_LIST_FILES})`,或list,list非常万能
list(APPEND ${SRC_LIST} ${SRC_LIST_FILES})
#移除变量
list(REMOVE_ITEM ${SRC_LIST} add.cpp)
#list还可以获取变量长度,`list(LENGTH ${SRC_LIST} SRC_LENGTH)`
#list还可以查找变量是否存在,`list(FIND ${SRC_LIST} SRC_NAME)`
#list还可以获取指定变量,`list(GET ${SRC_LIST} 1 SRC_ITEM)`,`list(GET ${SRC_LIST} 0 2 -2 SRC_ITEMS)`


#------------------------------------------------------------------------------
#-------------------------------头文件扫描目录添加--------------------------------
#将所有的头文件移动到include文件夹方便管理,使用该命令扫描头文件目录
include_directories(${PROJECT_SOURCE_DIR}/include)


#--------------------------------------------------------------------------------
#--------------------------------静态/动态库命令--------------------------------------
#制作静态库文件,最终文件名为`libadd.a`(archive)
# add_library(add_static STATIC ${SRC_LIST_FILES})
#制作动态库文件,最终文件名为`libadd.so`(shared object)
add_library(add_shared SHARED ${SRC_LIST_FILES})

#设置静态库链接,对于库`libadd.a`,可以写全名,也可以写`add`
# link_libraries(add_static)
# 仅设置静态库和动态库的查找位置,不自动添加
link_directories(${PROJECT_SOURCE_DIR}/lib)


#-----------------------------------------------------------------------------------------
#-------------------------------子目录CMakeLists.txt添加-----------------------------------------
#添加子目录模块,可以为相对路径,也可为绝对路径
add_subdirectory(calc)#相对
link_libraries(calc)#与上一行调换顺序会报错

#-------------------------------------------------------------------------------
#-----------------------------可执行文件生成---------------------------------------
#生成可执行文件`demo`,建议放最下面
# add_executable(demo ${SRC_LIST} ${SRC_LISTS})
add_executable(demo main.cpp )


#----------------------------------------------------------------------------------------
#----------------------------------动态库链接-----------------------------------------------
#设置动态库链接,在程序调用动态库函数时才会被加载到内存,应写在`add_executabel`后面
#意为将add_shared库链接到demo文件上,即从后向前依次链接,demo文件可以是源文件,也可以是动态库或可执行文件
#链接具有传递性,会互相链接
target_link_libraries(demo add_shared)


#---------------------------------------------------------------------------------------------
#---------------------------------------消息打印---------------------------------------------
#打印消息(日志),在cmake构建时打印
message("important message")
#[[
可用消息类型(默认为普通消息):
(无) :重要消息
STATUS :非重要消息
WARNING:CMake 警告, 会继续执行
AUTHOR_WARNING:CMake 警告 (dev), 会继续执行
SEND_ERROR:CMake 错误, 继续执行,但是会跳过生成的步骤
FATAL_ERROR:CMake 错误, 终止所有处理过程
]]
# message(AUTHOR_WARNING "important message")


#----------------------------------------------------------------------------------------------
#--------------------------------------------流程控制----------------------------------------------
##流程控制语法:
#if语句
# if(conditon)
# elseif(other_condition)
# else()
# endif()
#condition代表TRUE: 1,ON,YES,TRUE,Y,非零值,非空字符串
#condition代表TRUE: 0,OFF,NO,FLASE,N,IGNORE,NOTFOUND,空字符串
#condition可用逻辑控制:NOT,AND,OR
#condition可用比较控制:LESS,GREATER,EQUAL,LESS_EQUAL,GREATER_EQUAL
if(NOT (NOT ${SRC_LIST}))
message("not none:" ${SRC_LIST})
endif()
#condition 文件控制:EXISTS(文件是否存在),IS_DIRECTORY(文件是否为目录),IS_SYMLINK(文件是否为链接文件),IS_ABSOLUTE(是否为绝对路径),
if(NOT IS_DIRECTORY ${SRC_LIST})
message("not a directory:" ${SRC_LIST})
endif()
#其他condition:
#判断字符是否在列表(cmake_VERSION>=3.3)
# if("main.cpp" IN_LIST ${SRC_LIST})
# message("main.cpp is in list")
# endif()
#判断路径是否相等(双斜杠自动转义),cmake_version>=3.24
#if("main.cpp" PATH_EQUAL ${SRC_LIST})
#endif()

#foreach循环(for循环),数字循环(从零起,闭区间):
#foreach(item_var RANGE <start> <stop> [<step>])
foreach(i RANGE 10)
message("current i: " ${i})
endforeach()
foreach(i RANGE 5 10 2)
message("current custom i: " ${i})
endforeach()

#foreach循环(for循环),列表循环:(file命令列出绝对路径)
#foreach(item IN LISTS SRC_LIST SRC_LISTS) #可遍历多个列表SRC_LIST SRC_LISTS
#或
#foreach(item IN ITEMS ${SRC_LIST} ${SRC_LISTS}) #注意区别,加了${}
foreach(i IN ITEMS ${SRC_LIST_FILES})
message("current list: ${i}")
endforeach()
#foreach循环(for循环),列表循环:(aux_source_directories命令列出绝对路径)
foreach(i ${SRC_LISTS})
message("current list item: " ${i})
endforeach()


#while循环
#while(condition)
# code here
# endwhile()

欢迎关注我的其它发布渠道