填补一下CMake的空白,适合新手哟
CMake(好东西!!!)
当然,这篇文章只适用于新手入门,不适合进阶!!!
CMake
关于CMake的详细简介请去官网,那里有完整的文档
CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CMakeLists.txt。Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是 CMake 和 SCons 等其他类似系统的区别之处 (百度的)
下载CMake
Ubuntu:
sudo apt install cmake
安装完成后记得检测一下
cmake --version
出现下面的界面则是安装成功
Windows 下直接官网下载后安装,本文章将以Ubuntu来作为测试系统
具体文件已经上传到GitHub:https://github.com/Tan-fenyuan/final-cmake.git
如有需要,请各位看官自取,记得star
CMake操作
cmake
make
make install (安装)
CMake需要记住的一些入门知识
CMake 是需要从一个名为CMakeLists.txt 的文件里读取指定命令进行构建的,所以
想用好CMake,就必须得了解CMakeLists.txt的编写
下面是CMakeLists.txt中比较常见的命令
/*
CMakeLists.txt中参数严格区分大小写,命令不区分大小写
*/
CMAKE_SOURCE_DIR 最外层CMakeLists.txt所在的目录
PROJECT(项目名称) //也可以 project()
/*
poject(name,C CXX) 可以指定项目的语言格式 C为c文件, CXX为c++
也同时定义了两个CMake的变量:
项目名称_BINARY_DIR
项目名称_SOURCE_DIR
他们都指向当前的工作目录
*/
SET()
/*
顾名思义,就是设置,可以搭配下面的CMAKE_ARCHIVE_OUTPUT_DIRECTORY来设置所代表的位置
set也可以起到赋值变量的作用
SET(SRC main.cpp) SRC就包含了main.cpp
也可以包含多个文件,SET(SRC main.cpp t1.cpp t2.cpp)
*/
MESSAGE()
/*
message()向终端输出用户定义好的消息
*/
ADD_EXECUTABLE(可执行文件名 源文件)
/*
通过这个命令来生成可执行文件
通常生成的文件名
liunx下为: 可执行文件名
windows下为: 可执行文件名.exe
*/
ADD_SUBDIRECTORY()
/*
add_subdirectory(src) 编译src路径下的CMakeLists.txt文件内容
*/
CMAKE_ARCHIVE_OUTPUT_DIRECTORY:默认存放静态库的目录位置;
CMAKE_LIBRARY_OUTPUT_DIRECTORY:默认存放动态库的目录位置;
LIBRARY_OUTPUT_PATH:默认存放库文件的位置,如果产生的是静态库并且没有指定 CMAKE_ARCHIVE_OUTPUT_DIRECTORY 则存放在该目录下,动态库也类似;
CMAKE_RUNTIME_OUTPUT_DIRECTORY:存放可执行软件的目录;
构建
## 内部构建
直接在项目目录下进行cmake和make操作,这会导致出现很多临时文件,对于新手不友好,对于老手更不友好,所以不建议使用
## 外部构建
外部构建旨在隐藏不必要的临时文件,便于进行其他操作,外部操作方法如下:
在项目根目录里新建一个build目录用于cmake,
#假设项目目录为test
mkdir test #建立项目根目录
cd test #切换到项目里
touch CMakeLists.txt #建立CMakeLists.txt 该文件名字必须为CMakeLists.txt
vim CMakeLists.txt #编辑
mkdir build #新建一个用于cmake 的目录
cd build
cmake .. #要让cmake找到你的最外层CMakeLists.txt所在的目录
make #在build目录下进行make
让前面的test像一个项目
开始实践,让我们的test像一个项目
建立如上图层次的目录
注意不一定每个目录里都要有CMakeLists.txt文件,只要CMakeLists.txt里的各个路径引用正确即可
现在我们进入到根目录下的CMakeLists.txt里:
vim CMakeLists.txt
只有三句话:
CMAKE_MINIMUM_REQUIRED(VERSION 3.0)
这是规定cmake使用的最低版本,如果用户达不到这个版本,会提示用户进行升级
PROJECT(FINAL_TEST) 项目名为FINAL_TEST
ADD_SUBDIRECTORY(src bin) :将src路径下的CMakeLists.txt进行处理,并且将处理的结果放在bin下,如果是在build目录下cmake的,那么结果就会在build/bin/下
现在来到src下:
cd src
vim CMakeLists.txt
大部分都已经在前面讲过了,现在开始说没有说明的部分
INCLUDE_DIRECTORIES()
/*
要包含的头文件路径:由于CMAKE_SOURCE_DIR代表着最外层目录,所以头文件目录就为${CMAKE_SOURCE_DIR}/include
*/
ADD_LIBRARY()
/*
生成库文件
ADD_LIBRARY(静态库文件名 STATIC 源文件) 生成一个静态库文件
ADD_LIBRARY(动态库文件名 SHARED 源文件)生成一个动态库文件
静态库以.a为后缀,Windows下为.lib为后缀
动态库以.so为后缀,Windows下为.dll为后缀
一般的动态库都有版本关联
SET_TARGET_PROPERTIES(动态库文件名 PROPERTIES VERSION 1.1 SOVERSION 1.2)
VESRION 指动态库版本,SOVERSION 指API版本
*/
补充
还有一篇文章在准备中,CMake的安装和运行,以及使用git+上CMake进行版本控制也将在下一篇中出现
每个人都应该为自己的事业,为自己的理想去活一次,追逐自己的事业和理想并不容易,需要有很大的付出,也只有你内心的那个理想,才值得这么大的付出 ----<<左耳听风>>