代码调试工具 CMake篇

CMake

CMake是一个跨平台的自动化构建系统。它本身不是编译器,而是一个“生成构建文件的工具”。

简单来说:

CMake读取写的文件配置(CMakeList.txt)。根据当前的操作系统、编译器,生成合适的构建文件。

例如:

  • Linux生成Makefile
  • window生成Visual Studio 工程文件
  • macOs生成Xcode文件

然后可以用这些文件去编译项目。

1、CMake的构建流程

CMakeList.txt配置文件(跨平台可移植,任何平台都能读取)
CMake读取CMakeList.txt

生成平台相关构建文件

-Linux:Makefile

-Window:.lsn

-macOs:Xcode工程

调用对应的构建工具

-make(Linux)

-MSBuild(Window)

-xcodebuild(macOS)

编译器/链接器

(g++,clang++)

可执行文件/库

 1.1、CMake、Makefile、make的区别

编译一个C++程序,假设好像是盖房子

  • CMake=设计院

他根据你设计需求(CMakeList.txt),生成一个详细的施工图纸(Makefile)

  • Makefile=施工图纸

上面写的比较清楚:哪些源文件要准备,哪一步编译,哪一步链接

  • make=工头

工头不自己搬砖,他只是读Makefile,然后安排工人(编译器)一步步完成施工

  • 编译器=工人

真正干活的人,把源码翻译为机器码。

1.2、如何用CMake生成静态库和动态库

用户CMake生成静态库和动态库只需使用add_library,并指定STATIC或SHARED关键字

# 生成静态库
add_library(mylib_static STATIC mylib.cpp)

# 生成动态库
add_library(mylib_shared SHARED mylib.cpp)

静态库后缀:lib+库名字+.a

动态库后缀:.so  。有可执行权限

1.3、CMake构成

顶层 :指定版本、项目名称、添加子目录

cmake_minimum_required(VERSION 3.10)
project(MyProject)

# 添加子目录
add_subdirectory(lib)
add_subdirectory(app)

核心

# window上自动导出DLL符号
set(CMAKE_WINDOW_EXPORT_ALL_SYMBOLS ON)

#生成静态库
add_library(mylib_static STATIC mylib.cpp)


# 生成动态库
add_library(mylib_shared SHARED mylib.cpp)

add_executable :定义生成一个可执行程序。

add_executable(可执行程序名 源文件名称)

这里执行程序名与project中的项目名没有任何关系

源文件名可以是多个,多个用空格或者;间隔

定义变量

set(SRC_LIST add.c;div.c;sun.c)
add_executable(app ${SRC_LIST})

指定C++标准

# 在CMake中通过set指定
# 增加-std=C++11
set(CMAKE_CXX_STANDARD 11)

指定输出的路径

# 定义一个变量存储绝对路径
set(HOME /home/linux/sort)

# 定义一个路径设置为EXECUTABLE_OUTPUT_PATH 的宏
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin)

1.4、搜索文件

方式1:使用aux_sourse_directory 命令可以查找路径下的所有源文件

aux_sourse_directory(<dir> <variable>)

dir 要搜索的目录;variable从dir中搜索到的源文件存储在变量中。

方式2:file命令

file(GLOB/GLOB_RECURSE 变量名 要搜索的文件路径和文件类型)

GLOB指定目录下搜索满足条件的所有文件名生成一个列表,并将其存储在变量中。

GLOB_RECURSE:递归搜索指定目录。

1.5、头文件

指定头文件路径目录

include_directories(${}/include) 

1.6、链接库文件

link_libraries(<static lib> [<static lib> ...]

link_libraries(calc)

# 指定自定义静态库路径
link_directories(${}/lib1)

1.7、链接动态库

target_link_libraries()

动态库链接是具有传递性的,动态库的访问权限是public,只能传递一次

1.8、日志

message([STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR] "message to dispaly" ...)

[STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR]:是消息级别

1.9、字符串操作

拼接:

set(变量名 ${变量名1} ${变量名2})

多个变量合为一个。

1.10、list

1、获取字符串长度:list(LENGTH <list> <output variable>)

具体详细操作以后再实践中学习。细节不在详细描述了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值