浅聊一下cmake
浅聊一下cmake
什么是cmake
CMake是一个跨平台的编译工具,可以用简单的语句来描述所有平台的编译过程。
只要生成一份CMakeLists.txt文档,就可以利用CMake进行工程的搭建,能够输出各种各样的makefile或者project文件。
什么是makefile
makefile定义了一系列的规则来指定,哪些文件需要先编译,后编译,重新编译,甚至于进行更复杂的功能操作,有效地描述这些文件之间的依赖关系以及处理命令。
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,而且当个别文件改动后仅执行必要的处理,而不必重复整个编译过程,极大的提高了软件开发的效率。
Linux下
安装
安装基本上直接bing或者Google搜索一堆傻瓜式教程。
如果对版本要求不高可以直接安装
sudo apt install cmake
但是不建议这样
可以自己去wget下载到home目录下然后操作
可以参考这个链接:ubuntu安装cmake-CSDN博客
基本操作
1.在源码中新建一个CMakeLists.txt
2.在CMakeLists.txt中写代码
3.之后通常基本操作都是
mkdir build
cd build
cmake ..
make
先创建build文件夹
进入build文件夹
执行cmake生成文件都在build文件夹内
执行make,就是执行cmake生成makefile文件,生成你所需的东西
4.如果修改cmake想重新生成可以,在build目录终端下
rm -rf *
cmake ..
make clean
make
先强制删除build里面所有文件
重新执行cmake
将之前make生成东西全部删除
重新生成
基本语法
浅聊一下自己要写cmake时,了解的一些语法
1.指定最低版本
cmake_minimum_required(VERSION 3.1)
指定最低版本,一般第一行都是这个
2.project
project(demo VERSION 1.0 DESCRIPTION "xxx" LANGUAGES CXX)
demo是你你创建的工程名字,VERSION是你发布版本,DESCRIPTION 项目的描述,LANGUAGES支持C/CXX/CSharp(3.8+),等C/C++为默认值
3.设置语言标准
set(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED True)`
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
4.搜索所有cpp文件
aux_source_directory(dir xxx) 把目录(dir)下所有的源代码文件并将列表存储在一个变量xxx中。
aux_source_directory(project/ ALL) # 搜索当前目录下的所有.cpp文件
5.自定义搜索规则
file(GLOB ALL "project/*.cpp" "src/*.cpp")
也可以用file将这个两个目录下cpp文件放到ALL中,file可以不只是cpp文件可以是自己要选择的文件
6.set 设置变量
set(ALL 1.cpp 2.cpp)
使1,2.cpp放到变量ALL中
7.包含哪些文件
add_library(demo 1.cpp 2.cpp 3.cpp)
也可以用上面把所有cpp文件都放到一个变量中然后包含到demo中,或者不想全部cpp也可以用set变量让一部分cpp放进去变量
8.生成动态库或者静态库
add_library(abc STATIC xxx) # 生成静态库
add_library(abc SHARED xxx) # 生成动态库
xxx可以是变量也可以是自己指定一些文件
add_library 默认生成是静态库,通过以上命令生成文件名字。
在 Linux 下是: libabc libabc.so
在 Windows 下是: abc.lib abc.dll
9.设置包含的目录
include_directories(
${PROJECT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/include
)
来包含头文件
10.添加路径使链接器应在其中搜索库
link_directories([AFTER|BEFORE] directory1 [directory2 …])
LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/lib/)
11.设置target需要链接的库
target_link_libraries( 目标库 目标库需要链接的库 )
target_link_libraries(demo -lpthread)
12.设置target需要头文件路径
target_include_directories(demo PUBLIC ${PROJECT_SOURCE_DIR}/include)
13.生成可执行文件
add_executable(demo main.c)
14.message打印
message(${ALL})
可以将自己想要的东西打印到终端,检查错误
15.循环
if
if(<condition>)
<commands>
elseif(<condition>)
<commands>
else()
<commands>
endif()
foreach
是由分号或空格分隔的项目列表。每次迭代开始变量 <loop_var> 被设置为当前项的值。
foreach(<loop_var> <items>)
<commands>
endforeach()
while
如果 while命令,条件为真,则一直执行。
while(<condition>)
<commands>
endwhile()
break和 continue 支持 foreach 循环 和while 循环。
我们使用 break()命令提前终止循环,而使用 continue()命令可用于立即开始下一次迭代。
16.常用变量
PROJECT_SOURCE_DIR:工程的根目录
PROJECT_BINARY_DIR:运行cmake命令的目录,通常为${PROJECT_SOURCE_DIR}/build
PROJECT_NAME:返回通过 project 命令定义的项目名称
CMAKE_CURRENT_SOURCE_DIR:当前处理的 CMakeLists.txt 所在的路径
CMAKE_CURRENT_BINARY_DIR:target 编译目录
CMAKE_CURRENT_LIST_DIR:CMakeLists.txt 的完整路径
EXECUTABLE_OUTPUT_PATH:重新定义目标二进制可执行文件的存放位置
LIBRARY_OUTPUT_PATH:重新定义目标链接库文件的存放位置
17.还有很多语法,用到在查
生成动态库的小案例
1.生成动态库
cmake_minimum_required(VERSION 3.10)
project(demo)
#设置语言标准
SET(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED True)
SET(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
#拉取所有的.c文件
aux_source_directory(${PROJECT_SOURCE_DIR} ALL)
message(${ALL})
#生成动态库
add_library(demo SHARED ${ALL})
#设置动态库输出目录
set(LIBRARY_OUTPUT_PATH ../lib)
2.使用
cmake_minimum_required(VERSION 3.10)
project(demo2)
#设置语言标准
SET(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED True)
SET(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
#定义动态库位置
LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/lib/)
#指定编译的可执行文件
add_executable(demo2 main.c)
# 添加 ptpd 头文件路径
target_include_directories(demo2 PUBLIC ${PROJECT_SOURCE_DIR}/include)
set(EXECUTABLE_OUTPUT_PATH ../out)
Windows下
Windows直接下载cmake就OK,他有个gui界面使用
我只是拿来编译别人的文件库,里面直接有CMakeLists.txt,拿来直接在gui中选择要编译的东西即可。
如果有qt,它里面就直接有cmake,可以直接使用qt里面的cmake来生成文件,但是qt里面是MinGW的,vs里面可能不能直接使用。