c++编程的四个步骤
1. 预处理
c++中预处理指令以#开头,在预处理阶段,会对#define进行宏展开,处理#if,#else等条件指令,递归处理#include。这一步需要添加所有头文件的引用路径,生成.i文件
g++ -E main.cpp -o main.i
2. 编译
检查代码的规范性和语法错误等,检查完毕后将代码翻译成汇编语言文件,生成.S文件
g++ -S main.i -o main.s
3. 汇编
基于汇编语言文件生成二进制格式的目标文件
g++ -c main.s -o main.s
4. 链接
将目标代码与所依赖的库文件进行关联或者组装,合成一个可执行文件
g++ main.o -o main
动态链接库和静态链接库
主要区别是链接的阶段不同
静态链接库的链接发生在编译环节,如果一个工程依赖的是静态链接库,输出的库和可执行文件会将静态链接库*.a打包到该工程的输出文件中(可执行文件或者库),生成的文件会比较大
动态链接库的链接发生在程序的执行过程中,其在编译环节仅执行链接检查,而不是进行真正的链接,这样可以节省系统的开销,动态链接库加载后内存中仅保存一份拷贝,多个程序依赖一个链接库时不会重复加载和拷贝
cmake_minimum_required(VERSION 3.0) # 使用的cmake的脚本的最低版本,可以不写
project(test) #当前CMake构建的项目的信息(名字,当前项目的版本,当前项目的描述,地址,语言)
# 设定目标
# add_executable(可执行程序名 源文件名(可通过空格或;隔开多个源文件)) #生成一个可执行程序
add_executable(app ConsoleApplication2.cpp)
# 生成静态库
sdd_library(库名,动态库(shared)/静态库(static),源文件)
# 首先输入 cmake -S ./ -B ./ -G "MinGW Makefiles(linux中输入 cmake CMakeLists.txt) 执行cmake命令
# 输入mingw32-make.exe
# 定义变量
set(变量名 值) 值全都是string型,多个值用空格或者;分开
变量取值 ${变量名}
unset(变量名) # 删除变量
输出信息
message(输出内容)
在编写c++程序时要指定使用的c++标准,默认c++98标准
方法一:在 CMakeLists.txt文件中设置
set(CMAKE_CXX_STANDARD_11) 指定使用c++11标准
方法二:执行cmake命令时指定
cmake CMakeLists.txt -CMAKE_CXX_STANDARD=11
指定可执行程序输出的路径
set(EXECUTABLE_OUTPUT_PATH 路径)
取出所有源文件:搜索指定目录下的所有源文件(.c/.cpp)
ayx_source_directory(路径 接收文件名的变量)
file(GLOB/GLOB_RECURSE 变量名 要搜索的路径和文件名后缀) GLOB当前文件下,GLOB_RECURSE迭代搜索子文件
# 指定头文件路径
include_directories(头文件绝对路径)
制作静态库和动态库
在linux中,静态库中包含三部分:lib+名称.a,我们只需要指出库名称
在window中,静态库中包含三部分:lib+名称.lib,我们只需要指出库名称
在linux中,动态库中包含三部分:lib+名称.so,我们只需要指出库名称
在window中,动态库中包含三部分:lib+名称.dll,我们只需要指出 库名称
add_library(库名,动态库(shared)/静态库(static),源文件)
指定生成的库文件的路径
LIBRARY_OUTPUT_PATH 指定动态库和静态库的路径
EXECUTABLW_OUTPUT_PATH 指定动态库的路径
案例:
set(LIBRARY_OUTPUT_PATH 路径) 如果路径不存在,先生成路径
链接静态库
link_librarie(static 库名) 如果是系统提供的库只需指出库名字
link_directories(路径) 第三方库文件还要指定第三方库所在的路径
链接动态库:
target_link_libraries(目标 访问权限 库名)
目标可以说一个源文件也可以值一个动态库文件或者可执行文件
访问权限 库 是对应关系,访问权限默认为public
访问权限为public链接时有传递性
link_directories(路径) 第三方库文件还要指定第三方库所在的路径
为目标添加头文件目录
target_include_directories(目标 PUBLIC(权限) "../acc"(目录))
为目标添加库文件目录
target_link_directories (目标 PUBLIC(权限) "../acc"(目录))
字符串的拼接
SET(变量名 字符串1 字符串2...)
字符串的添加
list(APPEND 字符串 原字符串) # 拼接字符串
list(REMOVE_ITEM 原字符串 字符串) # 删除子字符串
list(LENGTH 列表名 变量) # 获取列表长度
list(GET 列表名 索引) # 获取指定索引的元素
list(JOIN 列表名 连接符 新生成字符串名) # 用连接符将列表中元素链接成一个
list(INSERT 列表 元素) # 在列表中指定位置插入元素
list(POP_BACK 列表名 记录被删除的内容的变量) # 删除最后一个元素
list(POP_FRONT 列表名 记录被删除的内容的变量) # 删除第一个元素
list(REMOVE_AT 列表名 索引) # 删除指定索引的内容
list(REMOVE_DUPLICATES 列表名) # 移除重复元素
list(SORT 列表名 排序方法) # 排序
add_definition(_D宏的名称) # 自定义宏
add_sundirectory(文件目录) # 添加子节点