cmake常用命令的一些整理
CMake 是什么我就不用再多说什么了,相信大家都有接触才会看一篇文章。对于不太熟悉的开发人员可以把这篇文章当个查找手册。
1.CMake语法
1.1 指定cmake的最小版本
cmake_minimum_required(version 版本号)
例如:
cmake_minimum_required(version 2.8)
1.2 定义工程名称
#定义工程名称
project(项目名称)
例如:
project(MyTest)
1.3 显示定义变量
set(var [value])
例如:
# 第一种用法,生成代码文件列表
#先直接设置SRC_LIST的值
set(SRC_LIST add.h add.cpp)
#然后再在SRC_LIST中追加main.cpp
set(SRC_LIST ${SRC_LIST} main.cpp)
第二中用法,设置库生成目录或者可执行文件生成目录
set( LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib/linux)
set( EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
1.4 设置编译类型
# 编译静态库
add_library(库名称 STATIC 代码文件名称)
编译动态库
add_library(库名称 SHARED 代码文件名称)
编译可执行程序
add_executable(可执行程序名 代码文件名称)
例如:
# 编译静态库
add_library(add STATIC add.h add.cpp)
add_library(add STATIC ${ADD_SRC} ${ADD_HDR})
编译动态库
add_library(add SHARED add.h add.cpp)
add_library(add SHARED ${ADD_SRC} ${ADD_HDR})
编译可执行程序
add_executable(main add.h add.cpp mai.cpp)
add_executable(main ${MAIN_SRC} ${MAIN_HDR})
1.5 指定静态库或者动态库编译输出目录
例如将当前编译的静态库或者动态库输出到当前项目文件夹lib子目录下
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
1.6 指定可执行程序编译输出目录
例如将当前可执行程序输出到当前项目文件夹的bin子目录下
#设定可执行二进制文件的目录
set( EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
1.7 设置链接库搜索目录
例如将链接库搜索目录设置为当前项目文件夹下lib/linux文件夹
link_directories(
P
R
O
J
E
C
T
S
O
U
R
C
E
D
I
R
/
l
i
b
/
l
i
n
u
x
)
<
/
c
o
d
e
>
<
/
p
r
e
>
<
/
d
i
v
>
<
h
3
>
1.8
设
置
包
含
目
录
<
/
h
3
>
<
p
>
例
如
将
包
含
目
录
设
置
为
当
前
项
目
文
件
夹
下
i
n
c
l
u
d
e
文
件
夹
<
/
p
>
<
d
i
v
c
l
a
s
s
=
"
h
i
g
h
l
i
g
h
t
"
>
<
p
r
e
>
<
c
o
d
e
c
l
a
s
s
=
"
l
a
n
g
u
a
g
e
−
t
e
x
t
"
>
i
n
c
l
u
d
e
d
i
r
e
c
t
o
r
i
e
s
(
{PROJECT_SOURCE_DIR}/lib/linux)</code></pre></div><h3>1.8 设置包含目录</h3><p>例如将包含目录设置为当前项目文件夹下include文件夹</p><div class="highlight"><pre><code class="language-text">include_directories(
PROJECTSOURCEDIR/lib/linux)</code></pre></div><h3>1.8设置包含目录</h3><p>例如将包含目录设置为当前项目文件夹下include文件夹</p><divclass="highlight"><pre><codeclass="language−text">includedirectories({PROJECT_SOURCE_DIR}/include)
1.9 设置宏定义
#预定义宏
add_definitions(-D宏名称)
例如:
add_definitions(-DWINDOWS)
add_definitions(-DLINUX)
1.10 链接静态库
link_libraries(
静态库1
静态库2
静态库3
…
)
注意,link_libraries中的静态库为全路径,常与1.7 link_directories 搭配使用,例如:
lib1.a lib2.a在目录${PROJECT_SOURCE_DIR}/lib/linux下,则先设置链接目录,再链接相应的库
#设置链接目录
link_directories( ${PROJECT_SOURCE_DIR}/lib/linux)
link_libraries(
lib1.a
lib2.a
)
1.11 链接动态库
target_link_libraries(所需生成的文件名称 所需链接的动态库名称)
例如
target_link_libraries(main dl)
1.12 link_libraries 和 target_link_libraries 区别
在cmake语法中,link_libraries和target_link_libraries是很重要的两个链接库的方式,虽然写法上很相似,但是功能上有很大区别:
(1) link_libraries用在add_executable之前,target_link_libraries用在add_executable之后
(2) link_libraries用来链接静态库,target_link_libraries用来链接导入库,即按照header file + .lib + .dll方式隐式调用动态库的.lib库
1.13 file语法
1.13.1 将文件夹所有的类型的文件添加到文件列表
例如将当前文件夹下所有.cpp文件的文件名加入到MAIN_SRC中,将当前文件夹下所有.h加入到MAIN_HDR中。
file(GLOB MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/.cpp)
file(GLOB MAIN_HDR ${CMAKE_CURRENT_SOURCE_DIR}/.h)
例如将当前文件夹子目录src文件夹下所有.cpp文件的文件名加入到MAIN_SRC中,将当前文件夹子目录src文件夹下所有.h加入到MAIN_HDR中。
file(GLOB MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/.cpp)
file(GLOB MAIN_HDR ${CMAKE_CURRENT_SOURCE_DIR}/src/.h)
1.13.2 递归搜索该文件夹,将文件夹下(包含子目录)符合类型的文件添加到文件列表
例如将当前文件夹下(包括子目录下)所有.cpp文件的文件名加入到MAIN_SRC中,所有.h加入到MAIN_HDR中
file(GLOB_RECURSE MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/.cpp)
file(GLOB_RECURSE MAIN_HDR ${CMAKE_CURRENT_SOURCE_DIR}/.h)
1.14 List操作
常见的List操作包括:
list(LENGTH <list> <output variable>)
list(GET <list> <element index> [<element index> …]
<output variable>)
list(APPEND <list> [<element> …])
list(FIND <list> <value> <output variable>)
list(INSERT <list> <element_index> <element> [<element> …])
list(REMOVE_ITEM <list> <value> [<value> …])
list(REMOVE_AT <list> <index> [<index> …])
list(REMOVE_DUPLICATES <list>)
list(REVERSE <list>)
list(SORT <list>)
1.14.1 List移除指定项
例如从MAIN_SRC移除指定项
list(REMOVE_ITEM MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/add.cpp)
1.14.2 将两个List链接起来
# 搜索当前目录
file(GLOB MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/.cpp)
file(GLOB MAIN_HDR ${CMAKE_CURRENT_SOURCE_DIR}/.h)
递归搜索当前目录下src子目录
file(GLOB_RECURSE MAIN_SRC_ELSE ${CMAKE_CURRENT_SOURCE_DIR}/src/.cpp)
file(GLOB_RECURSE MAIN_HDR_ELSE ${CMAKE_CURRENT_SOURCE_DIR}/src/.h)
将MAIN_SRC_ELSE中的值添加到MAIN_SRC
将MAIN_HDR_ELSE中的值添加到MAIN_HDR
list(APPEND MAIN_SRC ${MAIN_SRC_ELSE})
list(APPEND MAIN_HDR ${MAIN_HDR_ELSE})
1.15 添加子文件夹
例如
add_subdirectory(src)
该语句会在执行完当前文件夹CMakeLists.txt之后执行src子目录下的CMakeLists.txt
1.16 message输出消息机制
输出正常:
message(STATUS “Enter cmake ${CMAKE_CURRENT_LIST_DIR}”)
输出警告
message(WARNING “Enter cmake ${CMAKE_CURRENT_LIST_DIR}”)
输出错误:
message(FATAL_ERROR "Enter cmake
C
M
A
K
E
C
U
R
R
E
N
T
L
I
S
T
D
I
R
"
)
<
/
c
o
d
e
>
<
/
p
r
e
>
<
/
d
i
v
>
<
h
3
>
1.17
安
装
<
/
h
3
>
<
p
>
i
n
s
t
a
l
l
指
令
用
于
定
义
安
装
规
则
,
安
装
的
内
容
包
括
二
进
制
可
执
行
文
件
、
动
态
库
、
静
态
库
以
及
文
件
、
目
录
、
脚
本
等
。
<
/
p
>
<
h
3
>
1.17.1
目
标
文
件
安
装
<
/
h
3
>
<
p
>
例
如
:
<
/
p
>
<
d
i
v
c
l
a
s
s
=
"
h
i
g
h
l
i
g
h
t
"
>
<
p
r
e
>
<
c
o
d
e
c
l
a
s
s
=
"
l
a
n
g
u
a
g
e
−
t
e
x
t
"
>
i
n
s
t
a
l
l
(
T
A
R
G
E
T
S
u
t
i
l
R
U
N
T
I
M
E
D
E
S
T
I
N
A
T
I
O
N
b
i
n
L
I
B
R
A
R
Y
D
E
S
T
I
N
A
T
I
O
N
l
i
b
A
R
C
H
I
V
E
D
E
S
T
I
N
A
T
I
O
N
l
i
b
)
<
/
c
o
d
e
>
<
/
p
r
e
>
<
/
d
i
v
>
<
p
>
A
R
C
H
I
V
E
指
静
态
库
,
L
I
B
R
A
R
Y
指
动
态
库
,
R
U
N
T
I
M
E
指
可
执
行
目
标
二
进
制
,
上
述
示
例
的
意
思
是
:
<
/
p
>
<
p
>
如
果
目
标
u
t
i
l
是
可
执
行
二
进
制
目
标
,
则
安
装
到
{CMAKE_CURRENT_LIST_DIR}")</code></pre></div><h3>1.17 安装</h3><p>install 指令用于定义安装规则,安装的内容包括二进制可执行文件、动态库、静态库以及文件、目录、脚本等。</p><h3>1.17.1 目标文件安装</h3><p>例如:</p><div class="highlight"><pre><code class="language-text">install(TARGETS util RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)</code></pre></div><p>ARCHIVE指静态库,LIBRARY指动态库,RUNTIME指可执行目标二进制,上述示例的意思是:</p><p>如果目标util是可执行二进制目标,则安装到
CMAKECURRENTLISTDIR")</code></pre></div><h3>1.17安装</h3><p>install指令用于定义安装规则,安装的内容包括二进制可执行文件、动态库、静态库以及文件、目录、脚本等。</p><h3>1.17.1目标文件安装</h3><p>例如:</p><divclass="highlight"><pre><codeclass="language−text">install(TARGETSutilRUNTIMEDESTINATIONbinLIBRARYDESTINATIONlibARCHIVEDESTINATIONlib)</code></pre></div><p>ARCHIVE指静态库,LIBRARY指动态库,RUNTIME指可执行目标二进制,上述示例的意思是:</p><p>如果目标util是可执行二进制目标,则安装到{CMAKE_INSTALL_PREFIX}/bin目录 如果目标util是静态库,则安装到安装到
C
M
A
K
E
I
N
S
T
A
L
L
P
R
E
F
I
X
/
l
i
b
目
录
如
果
目
标
u
t
i
l
是
动
态
库
,
则
安
装
到
安
装
到
{CMAKE_INSTALL_PREFIX}/lib目录 如果目标util是动态库,则安装到安装到
CMAKEINSTALLPREFIX/lib目录如果目标util是动态库,则安装到安装到{CMAKE_INSTALL_PREFIX}/lib目录
1.17.2 文件夹安装
install(DIRECTORY include/ DESTINATION include/util)
这个语句的意思是将include/目录安装到include/util目录
1.18 设置编译选项
设置编译选项可以通过add_compile_options命令,也可以通过set命令修改CMAKE_CXX_FLAGS或CMAKE_C_FLAGS。 方式1
set( CMAKE_CXX_FLAGS "KaTeX parse error: Double subscript at position 400: …而set命令设置CMAKE_C_̲FLAGS或CMAKE_CXX…{PROJECT_SOURCE_DIR}/build;
- CMAKE_INCLUDE_PATH-----------------------------------------系统环境变量,非cmake变量;
- CMAKE_LIBRARY_PATH------------------------------------------系统环境变量,非cmake变量;
- CMAKE_CURRENT_SOURCE_DIR---------------------------当前处理的CMakeLists.txt所在的路径;
- CMAKE_CURRENT_BINARY_DIR-----------------------------target编译目录(使用ADD_SURDIRECTORY(src bin)可以更改此变量的值 ,SET(EXECUTABLE_OUTPUT_PATH <新路径>)并不会对此变量有影响,只是改变了最终目标文件的存储路径);
- CMAKE_CURRENT_LIST_FILE--------------------------------输出调用这个变量的CMakeLists.txt的完整路径;
- CMAKE_CURRENT_LIST_LINE--------------------------------输出这个变量所在的行;
- CMAKE_MODULE_PATH-----------------------------------------定义自己的cmake模块所在的路径(这个变量用于定义自己的cmake模块所在的路径,如果你的工程比较复杂,有可能自己编写一些cmake模块,比如SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake),然后可以用INCLUDE命令来调用自己的模块);
- EXECUTABLE_OUTPUT_PATH------------------------------重新定义目标二进制可执行文件的存放位置;
- LIBRARY_OUTPUT_PATH--------------------------------------重新定义目标链接库文件的存放位置;
- PROJECT_NAME-------------------------------------------------返回通过PROJECT指令定义的项目名称;
- CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS—用来控制IF ELSE语句的书写方式;
1.19.2 操作系统变量
- CMAKE_MAJOR_VERSION-----------------------------cmake主版本号,如3.4.1中的3;
- CMAKE_MINOR_VERSION-----------------------------cmake次版本号,如3.4.1中的4;
- CMAKE_PATCH_VERSION-----------------------------cmake补丁等级,如3.4.1中的1;
- CMAKE_SYSTEM----------------------------------------操作系统名称,包括版本名,如Linux-2.6.22;
- CAMKE_SYSTEM_NAME-------------------------------操作系统名称,不包括版本名,如Linux;
- CMAKE_SYSTEM_VERSION--------------------------操作系统版本号,如2.6.22;
- CMAKE_SYSTEM_PROCESSOR--------------------电脑处理器名称,如i686;
- UNIX--------------------------------------------------------在所有的类UNIX平台为TRUE,包括OS X和cygwin,Linux/Unix操作系统;
- WIN32-----------------------------------------------------在所有的win32平台为TRUE,包括cygwin,Windows操作系统;
- APPLE----------------------------------------------------苹果操作系统;
例如操作系统判断方式一:
if(WIN32)
message(STATUS “This operating system is Windows.”)
elseif(UNIX)
message(STATUS “This operating system is Linux.”)
elseif(APPLE)
message(STATUS “This operating system is APPLE.”)
endif(WIN32)
操作系统判断方式二:
if (CMAKE_SYSTEM_NAME MATCHES “Linux”)
message(STATUS "current platform: Linux ")
elseif (CMAKE_SYSTEM_NAME MATCHES “Windows”)
message(STATUS “current platform: Windows”)
elseif (CMAKE_SYSTEM_NAME MATCHES “FreeBSD”)
message(STATUS “current platform: FreeBSD”)
else ()
message(STATUS "other platform: KaTeX parse error: Double subscript at position 251: …i><li>==CMAKE_C_̲FLAGS==--------…env{name}
例如
message(STATUS “
e
n
v
n
a
m
e
"
)
<
/
c
o
d
e
>
<
/
p
r
e
>
<
/
d
i
v
>
<
h
3
>
1.19.5
C
M
A
K
E
I
N
C
L
U
D
E
C
U
R
R
E
N
T
D
I
R
<
/
h
3
>
<
p
>
自
动
添
加
C
M
A
K
E
C
U
R
R
E
N
T
B
I
N
A
R
Y
D
I
R
和
C
M
A
K
E
C
U
R
R
E
N
T
S
O
U
R
C
E
D
I
R
到
当
前
处
理
的
C
M
a
k
e
L
i
s
t
s
.
t
x
t
。
相
当
于
在
每
个
C
M
a
k
e
L
i
s
t
s
.
t
x
t
加
入
:
<
/
p
>
<
d
i
v
c
l
a
s
s
=
"
h
i
g
h
l
i
g
h
t
"
>
<
p
r
e
>
<
c
o
d
e
c
l
a
s
s
=
"
l
a
n
g
u
a
g
e
−
t
e
x
t
"
>
i
n
c
l
u
d
e
d
i
r
e
c
t
o
r
i
e
s
(
env{name}")</code></pre></div><h3>1.19.5 CMAKE_INCLUDE_CURRENT_DIR</h3><p>自动添加CMAKE_CURRENT_BINARY_DIR和CMAKE_CURRENT_SOURCE_DIR到当前处理 的CMakeLists.txt。 相当于在每个CMakeLists.txt加入:</p><div class="highlight"><pre><code class="language-text">include_directories(
envname")</code></pre></div><h3>1.19.5CMAKEINCLUDECURRENTDIR</h3><p>自动添加CMAKECURRENTBINARYDIR和CMAKECURRENTSOURCEDIR到当前处理的CMakeLists.txt。相当于在每个CMakeLists.txt加入:</p><divclass="highlight"><pre><codeclass="language−text">includedirectories({CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
1.20 条件判断
1.20.1 逻辑判断和比较
- if (expression):expression 不为空时为真,false的值包括(0,N,NO,OFF,FALSE,NOTFOUND);
- if (not exp):与上面相反;
- if (var1 AND var2):如果两个变量都为真时为真;
- if (var1 OR var2):如果两个变量有一个为真时为真;
- if (COMMAND cmd):如果 cmd 确实是命令并可调用为真;
- if (EXISTS dir) if (EXISTS file):如果目录或文件存在为真;
- if (file1 IS_NEWER_THAN file2):当 file1 比 file2 新,或 file1/file2 中有一个不存在时为真,文件名需使用全路径;
- if (IS_DIRECTORY dir):当 dir 是目录时为真;
- if (DEFINED var):如果变量被定义为真;
- if (var MATCHES regex):给定的变量或者字符串能够匹配正则表达式 regex 时为真,此处 var 可以用 var 名,也可以用
v
a
r
;
<
/
l
i
>
<
l
i
>
=
=
i
f
(
s
t
r
i
n
g
M
A
T
C
H
E
S
r
e
g
e
x
)
=
=
:
给
定
的
字
符
串
能
够
匹
配
正
则
表
达
式
r
e
g
e
x
时
为
真
。
<
/
l
i
>
<
/
u
l
>
<
h
3
>
1.20.2
数
字
比
较
<
/
h
3
>
<
u
l
>
<
l
i
>
=
=
i
f
(
v
a
r
i
a
b
l
e
L
E
S
S
n
u
m
b
e
r
)
=
=
:
如
果
v
a
r
i
a
b
l
e
小
于
n
u
m
b
e
r
时
为
真
;
<
/
l
i
>
<
l
i
>
=
=
i
f
(
s
t
r
i
n
g
L
E
S
S
n
u
m
b
e
r
)
=
=
:
如
果
s
t
r
i
n
g
小
于
n
u
m
b
e
r
时
为
真
;
<
/
l
i
>
<
l
i
>
=
=
i
f
(
v
a
r
i
a
b
l
e
G
R
E
A
T
E
R
n
u
m
b
e
r
)
=
=
:
如
果
v
a
r
i
a
b
l
e
大
于
n
u
m
b
e
r
时
为
真
;
<
/
l
i
>
<
l
i
>
=
=
i
f
(
s
t
r
i
n
g
G
R
E
A
T
E
R
n
u
m
b
e
r
)
=
=
:
如
果
s
t
r
i
n
g
大
于
n
u
m
b
e
r
时
为
真
;
<
/
l
i
>
<
l
i
>
=
=
i
f
(
v
a
r
i
a
b
l
e
E
Q
U
A
L
n
u
m
b
e
r
)
=
=
:
如
果
v
a
r
i
a
b
l
e
等
于
n
u
m
b
e
r
时
为
真
;
<
/
l
i
>
<
l
i
>
=
=
i
f
(
s
t
r
i
n
g
E
Q
U
A
L
n
u
m
b
e
r
)
=
=
:
如
果
s
t
r
i
n
g
等
于
n
u
m
b
e
r
时
为
真
。
<
/
l
i
>
<
/
u
l
>
<
h
3
>
1.20.3
字
母
表
顺
序
比
较
<
/
h
3
>
<
u
l
>
<
l
i
>
=
=
i
f
(
v
a
r
i
a
b
l
e
S
T
R
L
E
S
S
s
t
r
i
n
g
)
=
=
<
/
l
i
>
<
l
i
>
=
=
i
f
(
s
t
r
i
n
g
S
T
R
L
E
S
S
s
t
r
i
n
g
)
=
=
<
/
l
i
>
<
l
i
>
=
=
i
f
(
v
a
r
i
a
b
l
e
S
T
R
G
R
E
A
T
E
R
s
t
r
i
n
g
)
=
=
<
/
l
i
>
<
l
i
>
=
=
i
f
(
s
t
r
i
n
g
S
T
R
G
R
E
A
T
E
R
s
t
r
i
n
g
)
=
=
<
/
l
i
>
<
l
i
>
=
=
i
f
(
v
a
r
i
a
b
l
e
S
T
R
E
Q
U
A
L
s
t
r
i
n
g
)
=
=
<
/
l
i
>
<
l
i
>
=
=
i
f
(
s
t
r
i
n
g
S
T
R
E
Q
U
A
L
s
t
r
i
n
g
)
=
=
<
/
l
i
>
<
/
u
l
>
<
h
3
>
1.21
循
环
<
/
h
3
>
<
h
3
>
1.21.1
f
o
r
e
a
c
h
<
/
h
3
>
<
p
>
s
t
a
r
t
表
示
起
始
数
,
s
t
o
p
表
示
终
止
数
,
s
t
e
p
表
示
步
长
<
/
p
>
<
d
i
v
c
l
a
s
s
=
"
h
i
g
h
l
i
g
h
t
"
>
<
p
r
e
>
<
c
o
d
e
c
l
a
s
s
=
"
l
a
n
g
u
a
g
e
−
t
e
x
t
"
>
f
o
r
e
a
c
h
(
l
o
o
p
v
a
r
R
A
N
G
E
s
t
a
r
t
s
t
o
p
[
s
t
e
p
]
)
.
.
.
e
n
d
f
o
r
e
a
c
h
(
l
o
o
p
v
a
r
)
<
/
c
o
d
e
>
<
/
p
r
e
>
<
/
d
i
v
>
<
h
3
>
1.21.2
w
h
i
l
e
<
/
h
3
>
<
d
i
v
c
l
a
s
s
=
"
h
i
g
h
l
i
g
h
t
"
>
<
p
r
e
>
<
c
o
d
e
c
l
a
s
s
=
"
l
a
n
g
u
a
g
e
−
t
e
x
t
"
>
w
h
i
l
e
(
c
o
n
d
i
t
i
o
n
)
.
.
.
e
n
d
w
h
i
l
e
(
)
<
/
c
o
d
e
>
<
/
p
r
e
>
<
/
d
i
v
>
<
h
3
>
1.22
自
动
检
测
编
译
器
是
否
支
持
C
+
+
11
<
/
h
3
>
<
d
i
v
c
l
a
s
s
=
"
h
i
g
h
l
i
g
h
t
"
>
<
p
r
e
>
<
c
o
d
e
c
l
a
s
s
=
"
l
a
n
g
u
a
g
e
−
t
e
x
t
"
>
i
n
c
l
u
d
e
(
C
h
e
c
k
C
X
X
C
o
m
p
i
l
e
r
F
l
a
g
)
C
H
E
C
K
C
X
X
C
O
M
P
I
L
E
R
F
L
A
G
(
"
−
s
t
d
=
c
+
+
11
"
C
O
M
P
I
L
E
R
S
U
P
P
O
R
T
S
C
X
X
11
)
C
H
E
C
K
C
X
X
C
O
M
P
I
L
E
R
F
L
A
G
(
"
−
s
t
d
=
c
+
+
0
x
"
C
O
M
P
I
L
E
R
S
U
P
P
O
R
T
S
C
X
X
0
X
)
i
f
(
C
O
M
P
I
L
E
R
S
U
P
P
O
R
T
S
C
X
X
11
)
s
e
t
(
C
M
A
K
E
C
X
X
F
L
A
G
S
"
{var};</li><li>==if (string MATCHES regex)==:给定的字符串能够匹配正则表达式regex时为真。</li></ul><h3>1.20.2 数字比较</h3><ul><li>==if (variable LESS number)==:如果variable小于number时为真;</li><li>==if (string LESS number)==:如果string小于number时为真;</li><li>==if (variable GREATER number)==:如果variable大于number时为真;</li><li>==if (string GREATER number)==:如果string大于number时为真;</li><li>==if (variable EQUAL number)==:如果variable等于number时为真;</li><li>==if (string EQUAL number)==:如果string等于number时为真。</li></ul><h3>1.20.3 字母表顺序比较</h3><ul><li>==if (variable STRLESS string)==</li><li>==if (string STRLESS string)==</li><li>==if (variable STRGREATER string)==</li><li>==if (string STRGREATER string)==</li><li>==if (variable STREQUAL string)==</li><li>==if (string STREQUAL string)==</li></ul><h3>1.21 循环</h3><h3>1.21.1 foreach</h3><p>start 表示起始数,stop 表示终止数,step 表示步长</p><div class="highlight"><pre><code class="language-text">foreach(loop_var RANGE start stop [step]) ... endforeach(loop_var)</code></pre></div><h3>1.21.2 while</h3><div class="highlight"><pre><code class="language-text">while(condition) ... endwhile()</code></pre></div><h3>1.22 自动检测编译器是否支持C++11</h3><div class="highlight"><pre><code class="language-text">include(CheckCXXCompilerFlag) CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11) CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X) if(COMPILER_SUPPORTS_CXX11) set(CMAKE_CXX_FLAGS "
var;</li><li>==if(stringMATCHESregex)==:给定的字符串能够匹配正则表达式regex时为真。</li></ul><h3>1.20.2数字比较</h3><ul><li>==if(variableLESSnumber)==:如果variable小于number时为真;</li><li>==if(stringLESSnumber)==:如果string小于number时为真;</li><li>==if(variableGREATERnumber)==:如果variable大于number时为真;</li><li>==if(stringGREATERnumber)==:如果string大于number时为真;</li><li>==if(variableEQUALnumber)==:如果variable等于number时为真;</li><li>==if(stringEQUALnumber)==:如果string等于number时为真。</li></ul><h3>1.20.3字母表顺序比较</h3><ul><li>==if(variableSTRLESSstring)==</li><li>==if(stringSTRLESSstring)==</li><li>==if(variableSTRGREATERstring)==</li><li>==if(stringSTRGREATERstring)==</li><li>==if(variableSTREQUALstring)==</li><li>==if(stringSTREQUALstring)==</li></ul><h3>1.21循环</h3><h3>1.21.1foreach</h3><p>start表示起始数,stop表示终止数,step表示步长</p><divclass="highlight"><pre><codeclass="language−text">foreach(loopvarRANGEstartstop[step])...endforeach(loopvar)</code></pre></div><h3>1.21.2while</h3><divclass="highlight"><pre><codeclass="language−text">while(condition)...endwhile()</code></pre></div><h3>1.22自动检测编译器是否支持C++11</h3><divclass="highlight"><pre><codeclass="language−text">include(CheckCXXCompilerFlag)CHECKCXXCOMPILERFLAG("−std=c++11"COMPILERSUPPORTSCXX11)CHECKCXXCOMPILERFLAG("−std=c++0x"COMPILERSUPPORTSCXX0X)if(COMPILERSUPPORTSCXX11)set(CMAKECXXFLAGS"{CMAKE_CXX_FLAGS} -std=c++11”)
elseif(COMPILER_SUPPORTS_CXX0X)
set(CMAKE_CXX_FLAGS “${CMAKE_CXX_FLAGS} -std=c++0x”)
else()
message(STATUS "The compiler KaTeX parse error: Expected 'EOF', got '#' at position 473: …demo demo.cpp) #̲ 生成可执行文件
add_li…{第三方库项目名称} PROPERTIES FOLDER “目标文件夹名称”)
2 错误解决方案
2.1 Cannot specify link libraries for target “/…/…/lib/linux/libMyDll.a” which
这个问题要将生成执行文件、静态库、动态库的声明
add_executable(demo demo.cpp) # 生成可执行文件
add_library(common STATIC util.cpp) # 生成静态库
add_library(common SHARED util.cpp) # 生成动态库或共享库
放在
target_link_libraries()
之前。
2.2 警告:检测到时钟错误。您的创建可能是不完整的。
在项目根目录下执行命令:
touch *
更新所有文件时间。
![微信二维码](https://i-blog.csdnimg.cn/blog_migrate/9b2da48a8b03d0058859e982cefa57a4.png)