cmake

发布于:2024-12-07 ⋅ 阅读:(27) ⋅ 点赞:(0)
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(文件目录)				# 添加子节点


网站公告

今日签到

点亮在社区的每一天
去签到