Leo Technology Stack Leo Technology Stack
首页
  • Android
  • Web
  • SpringBoot
  • 数据库
  • Docker
  • Netty
  • KubeSphere
  • Linux
  • Android Framework
  • 开源库
思维
  • 面试
  • 投资理财
  • 杂事记录
  • 索引

    • 分类
    • 标签
    • 归档
  • 开源项目

    • Advance Markdown
    • AnLibrary (opens new window)

Leo

不知名的架构师
首页
  • Android
  • Web
  • SpringBoot
  • 数据库
  • Docker
  • Netty
  • KubeSphere
  • Linux
  • Android Framework
  • 开源库
思维
  • 面试
  • 投资理财
  • 杂事记录
  • 索引

    • 分类
    • 标签
    • 归档
  • 开源项目

    • Advance Markdown
    • AnLibrary (opens new window)
  • 目录页

  • 前端

  • 后端

  • Linux

    • Linux

      • Vim配置
      • Cmake
        • Linux介绍
          • Linux目录结构
        • GCC编译器
          • 编译过程
          • g++重要编译参数
        • GDB调试器
          • 常用调试参数
          • 常用调试命令
        • Clang编译器
          • 与GCC差异
        • CMake
          • 语法特性
          • 重要指令和常用变量
          • Cmake命令汇总
          • Cmake常见变量汇总
          • CMake编译工程
      • Linux概念扫盲
    • Android Framework

    • 开源库

  • thinking

  • interview

  • notes
  • Linux
  • Linux
2021-05-07

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

# 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
  • -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
  • -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
  • WaLL 打印警告信息
# 打印出gcc提供的警告信息
g++ -Wall test.cpp
1
2
  • -w 关闭警告信息
# 关闭所有警告信息
g++ -w test.cpp
1
2
  • -std=c++ 设置编译标准
# 使用 c++11 标准编译 test.cpp
g++ -std=c++11 test.cpp
1
2
  • -o 制定输出文件

# 指定即将产生的文件名
# 指定输出可执行文件名为test
g++ test.cpp -o test

1
2
3
4
5
  • -D 定义宏

# 在使用gcc/g++编译的时候定义宏
# 常用场景:
# -DDEBUG 定义DEBUG宏,可能文件中有DEBUG宏部分的相关信息,用个DDEBUG来选择开启或关闭DEBUG

1
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

# 常用调试参数

# 常用调试命令

命令 案例 解释
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
print
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)
#CMake
上次更新: 2022-04-28, 11:21:32
Vim配置
Linux概念扫盲

← Vim配置 Linux概念扫盲→

Theme by Leo | Copyright © 2016-2022 Leo | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式