Cmake
# Linux介绍
Linux是开源的操作系统
Linux一切皆文件,对于文件的操作种类有哪些
- 创建文件
- 编辑文件
- 保存文件
- 关闭文件
- 重命名文件
- 删除文件
- 恢复文件
# Linux目录结构
bin: 全称binary,含义二进制,该目录存储的都是一些二进制文件,文件都是可以被运行的
boot
cdrom
Desktop
dev:该目录主要存放的是外接设备,例如盘,光盘,在其中的外设设备是不能直接被使用的,需要挂载
etc:该目录主要存储一些配置文件
home:家
Home
lib
lib32
lib64
libx32
lost+found
media
mnt:当外设设备需要挂载的时候,就需要挂载在mnt目录下
opt
proc:全称Process,该目录存放的是Linux运行的进程
root:该目录是root用户自己的家目录
run
sbin:全称Super Binary,该目录也是存储一些可执行的二进制文件,但必须要super权限才可以执行
snap
srv
sys
Templates
tmp:表示临时的,当系统运行时候产生的的临时文件会存在该目录
Users
usr:存放用户自己安装的软件
var:存放系统/程序的日志文件目录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# GCC编译器
- GCC编译器支持编译Go、Objective-C、Objective-C++、Fortran、Ada、D、BRIG(HSAIL)等程序
- 使用gcc编译c代码
- 使用g++编译C++代码
# 编译过程
1.预处理 Pre-Processing
# -E 选项指示编译器仅对输入文件进行预处理 g++ -E test.cpp -o test.i
1
2
2.编译 Compiling
-S 编译选项告诉g++在为C++代码产生了汇编语言后停止编译 g++产生的汇编语言文件的缺省扩展名是.s g++ -S test.i -o test.s
1
2
3
3.汇编 Assembling
# -c告诉g++仅把源代码编译成机器语言的目标代码 # 缺省值是目标代码文件有一个.o的扩展名 g++ -C test.s -o test.o
1
2
3
4.链接 Linking
-o 编译选项来为将产生的可执行文件用指定的文件名 g++ test.o -o test
1
2
# g++重要编译参数
-g 编译带调试信息的可执行文件
O[n] 优化源代码
# -O 同时减少代码长度和执行时间,等价于 -O1
# -O0 表示不做优化
# -O1 默认优化
# -O2 除了完成-O1的优化之外,还进行额外的调整工作,如指令调整等
# -o3 包括循环展开和其他一些与处理特性相关的优化工作
# 编译速度变慢,执行速度加快
#
g++ -O2 test.cpp
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
- -l | -L 指定库文件|指定库文件路径
# -l参数用来指定程序要链接的库,-l紧跟的就是库名
# 在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接
# 链接glob库
g++ -lglob test.cpp
# 如果库文件没有放在以上三个目录里,需要使用-l参数制定库文件路径所在的目录
# -L 参数紧跟着的就是库文件所在的目录名
# 链接mylib库,mylib.so库在~/test/mylib/目录下
g++ -L/~/test/mylib/ -lmylib test.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
- -I 指定头文件搜索路径
# -I
# /usr/include目录一般是不用指定的,gcc知道去那里找,但 是如果头文件不在/usr/icnclude
里我们就要用-I参数指定了,比如头文件放在/myinclude目录里,那编译命令行就要加上I/myinclude 参数了,如果不加你会得到一个”xxxx.h: No such file or directory”的错
误。-I参数可以用相对路径,比如头文件在当前 目录,可以用-I.来指定。上面我们提到的–cflags参
数就是用来生成-I参数的
1
2
3
4
5
6
7
2
3
4
5
6
7
- WaLL 打印警告信息
# 打印出gcc提供的警告信息
g++ -Wall test.cpp
1
2
2
- -w 关闭警告信息
# 关闭所有警告信息
g++ -w test.cpp
1
2
2
- -std=c++ 设置编译标准
# 使用 c++11 标准编译 test.cpp
g++ -std=c++11 test.cpp
1
2
2
- -o 制定输出文件
# 指定即将产生的文件名
# 指定输出可执行文件名为test
g++ test.cpp -o test
1
2
3
4
5
2
3
4
5
- -D 定义宏
# 在使用gcc/g++编译的时候定义宏
# 常用场景:
# -DDEBUG 定义DEBUG宏,可能文件中有DEBUG宏部分的相关信息,用个DDEBUG来选择开启或关闭DEBUG
1
2
3
4
5
2
3
4
5
# GDB调试器
- GDB(GNU Debugger)是一个用来调试c/c++程序的功能强大的调试器,是Linux系统开发c/c++最常见的调试器
- GDB可以跟踪程序中的错误,从而减少程序员的工作量
GDB主要功能
- 设置断点
- 使程序在指定的代码上暂停执行,便于观察
- 单布执行程序,便于调试
- 查看程序中变量值的变化
- 动态改变程序的执行环境
- 分析崩溃程序产生的core文件
进入调试
// g++方式
g++ -g test.cpp -o test
// cmake方式,-g
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -g")
gdb ./test
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 常用调试参数
# 常用调试命令
命令 | 案例 | 解释 |
---|---|---|
start | (gdb) start | 开始调试,停在第一行代码处 |
list | (gdb) l 5 (gdb) l main (gdb) list (gdb) l - | 查看第5行周围代码 查看函数为main函数周围的代码 查看当前行的后面的代码 查看当前行的前面代码 |
break | (gdb) break function (gdb) break lineNumber (gdb) break +offset/-offset (gdb) break filename:lineNumber (gdb) break filename:function (gdb) break *address (gdb) break (gdb) break ... if condition | 在指定的函数添加断点 在指定的代码行打断点 在当前行的前或后面的offset行打断点,offset为自然数 在名称为filename的文件中的第lineNumber行打断点 在名称为filename的文件中的function函数打断点 在程序运行的内存地址处打断点 在下一条命令处停止运行 ?? |
delete | (gdb) delete | 删除所有断点 |
next | (gdb) next 5 | 单步跟踪,如果有函数调用不会进入函数,如果后面不加 count表示一条一条的执行,加count表示执行后面的count条指令 |
step | ||
set step-mode | ||
finish | ||
util | ||
stepi | ||
nexti | ||
continue | ||
watch | ||
return | ||
info | ||
run | ||
quit |
# Clang编译器
# 与GCC差异
# CMake
- Cmake是一个跨平台的安装编译工具、可以用简单的语句描述所有平台的安装(编译过错)
- Cmake已经成为大部分C++开源项目标配
# 语法特性
- 基本语法格式:指令(参数1 参数2 ...)
- 参数使用括弧
- 参数之间用空格或者分号分开
- 指令是大小写无关的,参数和变量是大小写相关的
- 变量使用${}方式取值,但是在IF控制语句中是直接使用变量名
# 重要指令和常用变量
# 重要指令
- cmake_mininum_required 指定Cmake的最小版本要求
- project 定义工程名称,并可指定工程支持的语言
- set 显式的定义变量
- include_directions 向工程添加多个特定的头文件搜索路径
- link_directions 向工程添加多个特定的库文件搜索路径
- add_library 生成库文件
- add_compile_options 添加编译参数
- add_executable 生成可执行文件
- target_link_libraries 为target添加要链接的共享库
- add_subdirectory 向当前工程添加存放资源文件的子目录,并可以指定中间二进制和目标二进制存放的位置
- aux_source_directory 发现一个目录下所有的源代码文件并将列表存储在一个变量中,这个指令临时被用来自动构建文件列表
# 常用变量
- CMAKE_C_FLAGS gcc编译选项
- CMAKE_CXX_FLAGS g++编译选项
- CMAKE_BUILD_TYPE 编译类型(Debug、Release)
- CMAKE_BINARY_DIR
- PROJECT_BINARY_DIR
- _BINARY_DIR
- CMAKE_SOURCE_DIR
- PROJECT_SOURCE_DIR
- _SOURCE_DIR
- CMAKE_C_COMPILER 指定C编译器
- CMAKE_CXX_COMPILER 指定C++编译器
- EXECUTABLE_OUTPUT_PATH 可执行文件输出的存放路径
- LIBRARY_OUTPUT_PATH 库文件输出的存放路径
# Cmake命令汇总
命令 | 解释 |
---|---|
cmake_minimum_required(VERSION 3.15) | CMake 支持的最低版本 |
project(hello_cmake) | 指定一个项目名称 |
add_executable(hello_cmake main.cpp) | 从指定的源文件构建指定的可执行文件。 参数1:可执行文件的名称; 参数2:源文件列表。 |
add_library(hello_library STATIC src/hello.cpp) | 从若干源文件创建库 参数1:目标 参数2: STATIC:静态库 SHARED:动态库 INTERFACE:不构建任何库,一般作为仅标头的库的标识 参数3:源文件列表 |
add_library(hello::library ALIAS hello_library) | 将 hello_library 取别名为 hello::library。 |
target_include_directories(target PRIVATE ${PROJECT_SOURCE_DIR}/include) | 指定在编译给定目标时要使用的包含目录。target 必须由诸如 add_executable() 或 add_library() 之类的命令创建。 参数1:目标; 参数2: PRIVATE:仅作为本目标的包含目录; INTERFACE:其他目标链接到本目标时作为其他目标的包含目录; PUBLIC:既作为本目标的包含目录,又作为连接到本目标的其他目标的包含目录。对于PUBLIC标头来说,最好令其拥有命名空间以避免命名冲突; 参数3:头文件路径。 |
target_link_libraries(hello_binary PRIVATE hello_library) | 使给定目标链接指定的库。 |
install(TARGETS cmake_examples_inst_bin DESTINATION bin) | TARGET:要安装的目标; DIRECTORY:要安装的目录; FILES:要安装的文件; DESTINATION:目标文件夹名。 |
target_compile_definitions(cmake_examples_compile_flags PRIVATE EX3) | 对给定目标指定 Flag。 |
target_compile_options() | 对给定目标指定编译器选项。 |
find_package() | 查找指定的包,格式见相应的 Find... .cmake 文件。 |
target_compile_features(hello_cpp11 PUBLIC cxx_auto_type) | 指定给定目标的编译特性(例如 C++ 标准)(CMake 3.1 后可用)。 |
configure_file(http://ver.h.in ${PROJECT_BINARY_DIR}/ver.h @ONLY) | 将参数1的文件配置后生成到参数2的文件。默认配置所有${}包裹和@@包裹的内容。@ONLY 表示仅允许配置@@包裹的内容。 |
# Cmake常见变量汇总
变量 | 解释 |
---|---|
CMAKE_SOURCE_DIR | 根源目录 |
CMAKE_CURRENT_SOURCE_DIR | 当前所在的源目录(如果使用子项目) |
CMAKE_BINARY_DIR | 根构建目录(运行 cmake 命令的目录) |
CMAKE_CURRENT_BINARY_DIR | 当前所在的构建目录 |
PROJECT_SOURCE_DIR | 当前项目的源目录 |
PROJECT_BINARY_DIR | 当前项目的构建目录 |
CMAKE_INSTALL_PREFIX | 安装路径 |
CMAKE_BUILD_TYPE | 构建类型(Release、Debug、MinSizeRel 或 RelWithDebInfo) |
CMAKE_CXX_FLAGS | C++ Flags |
CMAKE_C_FLAGS | C Flags |
CMAKE_LINKER_FLAGS | 链接器 Flags |
CMAKE_MODULE_PATH | CMake 查找模块(find_package)的搜索路径 |
CMAKE_C_COMPILER | 用于编译 C 的程序 |
CMAKE_CXX_COMPILER | 用于编译 C++ 的程序 |
CMAKE_LINKER | 用于链接的程序 |
CMAKE_CXX_STANDARD | 指定需要的 C++ 标准(CMake 3.1 后可用) |
PROJECT_NAME | 当前使用 project() 创建的项目名称 |
name_SOURCE_DIR | 名为“name”的项目的源目录 |
name_BINARY_DIR | 名为“name”的项目的二进制目录 |
# CMake编译工程
#
编辑此页 (opens new window)
上次更新: 2022-04-28, 11:21:32