1.project(HELLO)
project命令用于设置工程的名称,括号里的参数HELLO便是我们要设置的工程名称;设置工程名称并不是强制性的,但是最好加上。
2.add_executable(hello ./main.c)
add_executable用于生成一个可执行文件,第一个参数代表生成的可执行文件对应的文件名,第二个参数代表对应的源文件。
3.使用out-of-source方式构建
在上面的例子中,cmake 生成的文件以及最终的可执行文件 hello 与工程的源码文件 main.c 混在了一
起,这使得工程看起来非常乱,当我们需要清理 cmake 产生的文件时将变得非常麻烦,这不是我们想看到
的;我们需要将构建过程生成的文件与源文件分离开来,不让它们混杂在一起,也就是使用out-of-source方
式构建。
cd build/
cmake ../
make
../ 是一个相对路径,表示当前目录的上一级目录。
这样cmake生成的中间文件以及make编译生成的可执行文件就全部在build目录下了,如果要清理工
程,直接删除build目录即可,这样就方便多了。
4.set(SRC_LIST main.c hello.c)
"project(HELLO)
set(SRC_LIST main.c hello.c)
add_executable(hello ${SRC_LIST})"
set命令用于设置变量,如果变量不存在则创建
该变量并设置它;在本例中,我们定义了一个SRC_LIST变量,SRC_LIST变量是一个源文件列表,记录生
成可执行文件hello所需的源文件main.c和hello.c,而在add_executable命令引用了该变量;当然我们也可
以不去定义SRC_LIST变量,直接将源文件列表写在add_executable命令中,如下:
add_executable(hello main.c hello.c)
5.add_library(libhello hello.c)
"project(HELLO)
add_library(libhello hello.c)
add_executable(hello main.c)
target_link_libraries(hello libhello)"
add_library命令用于生成库文件,在本例中我们传入了两个参数,第一个参数表示库文件的名字,需要
注意的是,这个名字是不包含前缀和后缀的名字;在Linux系统中,库文件的前缀是lib,动态库文件的后
缀是.so,而静态库文件的后缀是.a;所以,意味着最终生成的库文件对应的名字会自动添加上前缀和后缀。
第二个参数表示库文件对应的源文件。
本例中,add_library命令生成了一个静态库文件liblibhello.a,如果要生成动态库文件,可以这样做:
add_library(libhello SHARED hello.c) #生成动态库文件
add_library(libhello STATIC hello.c) #生成静态库文件
6.target_link_libraries(hello libhello)"
target_link_libraries命令为目标指定依赖库,在本例中,hello.c被编译为库文件,并将其链接进hello程
序。
7.set_target_properties(libhello PROPERTIES OUTPUT_NAME “hello”)
修改生成的库文件名字
"cmake_minimum_required(VERSION 3.5)
project(HELLO)
add_library(libhello SHARED hello.c)
set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")
add_executable(hello main.c)
target_link_libraries(hello libhello) "
set_target_properties用于设置目标的属性,这里通过set_target_properties命令对libhello目标的
OUTPUT_NAME属性进行了设置,将其设置为hello。
8.cmake_minimum_required(VERSION 3.5)
该命令用于设置当前工程的cmake最低版本号要求,当然这个并不是强制性的,但是最好还是加上。
9.add_subdirectory(libhello)
add_subdirectory命令,该命令告诉cmake去子目录中寻找新的CMakeLists.txt文件并解析它
10.include_directories(${PROJECT_SOURCE_DIR}/libhello)
include_directories:这是 CMake 提供的一个命令,用于向编译器的头文件搜索路径中添加指定的目录。在编译 C 或 C++ 项目时,编译器需要知道在哪里找到 #include 指令所引用的头文件,通过这个命令可以告诉编译器额外的搜索路径。
P
R
O
J
E
C
T
S
O
U
R
C
E
D
I
R
:这是
C
M
a
k
e
内置的一个变量,它代表当前项目的源目录,也就是包含顶级
C
M
a
k
e
L
i
s
t
s
.
t
x
t
文件的目录。
/
l
i
b
h
e
l
l
o
:这是一个相对路径,表示在项目源目录下的
l
i
b
h
e
l
l
o
子目录。综合起来,
i
n
c
l
u
d
e
d
i
r
e
c
t
o
r
i
e
s
(
{PROJECT_SOURCE_DIR}:这是 CMake 内置的一个变量,它代表当前项目的源目录,也就是包含顶级 CMakeLists.txt 文件的目录。 /libhello:这是一个相对路径,表示在项目源目录下的 libhello 子目录。 综合起来,include_directories(
PROJECTSOURCEDIR:这是CMake内置的一个变量,它代表当前项目的源目录,也就是包含顶级CMakeLists.txt文件的目录。/libhello:这是一个相对路径,表示在项目源目录下的libhello子目录。综合起来,includedirectories({PROJECT_SOURCE_DIR}/libhello) 命令的作用是将项目源目录下的 libhello 目录添加到编译器的头文件搜索路径中。
11.
P
R
O
J
E
C
T
B
I
N
A
R
Y
D
I
R
含义:表示项目的二进制目录,即执行
c
m
a
k
e
命令进行构建时所在的目录,用于存放构建过程中生成的中间文件和最终产物,如可执行文件、库文件等。举例:在一个典型的源外构建(
o
u
t
−
o
f
−
s
o
u
r
c
e
b
u
i
l
d
)场景中,如果项目的源目录是
/
h
o
m
e
/
u
s
e
r
/
p
r
o
j
e
c
t
/
s
r
c
,而构建目录是
/
h
o
m
e
/
u
s
e
r
/
p
r
o
j
e
c
t
/
b
u
i
l
d
,那么在
C
M
a
k
e
脚本中
{PROJECT_BINARY_DIR} 含义:表示项目的二进制目录,即执行cmake命令进行构建时所在的目录,用于存放构建过程中生成的中间文件和最终产物,如可执行文件、库文件等。 举例:在一个典型的源外构建(out-of-source build)场景中,如果项目的源目录是/home/user/project/src,而构建目录是/home/user/project/build,那么在 CMake 脚本中
PROJECTBINARYDIR含义:表示项目的二进制目录,即执行cmake命令进行构建时所在的目录,用于存放构建过程中生成的中间文件和最终产物,如可执行文件、库文件等。举例:在一个典型的源外构建(out−of−sourcebuild)场景中,如果项目的源目录是/home/user/project/src,而构建目录是/home/user/project/build,那么在CMake脚本中{PROJECT_BINARY_DIR}就指代/home/user/project/build。
P
R
O
J
E
C
T
S
O
U
R
C
E
D
I
R
含义:代表项目的源目录,即包含项目顶级
C
M
a
k
e
L
i
s
t
s
.
t
x
t
文件以及所有源代码、头文件等原始文件的目录。举例:在上述例子中,
{PROJECT_SOURCE_DIR} 含义:代表项目的源目录,即包含项目顶级CMakeLists.txt文件以及所有源代码、头文件等原始文件的目录。 举例:在上述例子中,
PROJECTSOURCEDIR含义:代表项目的源目录,即包含项目顶级CMakeLists.txt文件以及所有源代码、头文件等原始文件的目录。举例:在上述例子中,{PROJECT_SOURCE_DIR}就指代/home/user/project/src。
12.set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
EXECUTABLE_OUTPUT_PATH 变量控制可执行文件的输出路径
"include_directories(${PROJECT_SOURCE_DIR}/libhello)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
add_executable(hello main.c)
target_link_libraries(hello libhello) "
13.set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
LIBRARY_OUTPUT_PATH 变量控制库文件的输出路径。
"set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
add_library(libhello hello.c)
set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")"
14.cmake 提供了很多命令,每一个命令都有它自己的功能、作用,通过这个链接地址
https://cmake.org/cmake/help/v3.5/manual/cmake-commands.7.html 可以查询到所有的命令及其相应的介绍、使
用方法等等