CMAKE

1、简易:

cmake_minimum_required ( VERSION 2.8)//确定cmake最低版本

project ( learn_cmake CXX) //项目名称和编译语言

add_executable (hello hello.cpp)

注意:变量的使用和Makefile不同,CMake是利用大括号,如${SRC_LIST}

2、多个源文件

cmake_minimum_required ( VERSION 2.8)//确定cmake最低版本

project ( learn_cmake CXX) //项目名称和编译语言,C++使用CXX, C语言使用C

aux_source_directory(. SRC_LIST) //将dir(.)目录中的所有源文件都存储在var变量中

set(CMAKE_CXX_STANDARD ...) //设置编译语言版本

add_executable (hello ${SRC_LIST})

3、头文件在别的文件夹

include_directories(dir)//自动去其他文件夹寻找头文件

4、头文件和源文件分离:

#引入头文件

Include_directories(./inc_dir1 ./inc_dir2)

#获源文件

aux_source_directory( src_dir1 SRC_LIST1)

aux_source_directory( src_dir2 SRC_LIST2)

aux_source_directory( main_dir MAIN_DIR)

#生成可执行文件。

add_executable(hello {SRC_LIST1} {SRC_LIST2} ${MAIN_DIR} )

一个CMakeLists.txt文件。

解释一下:

PROJECT_BINARY_DIR是cmake系统变量,意思是执行cmake命令的目录,我们计划在build目录下执行cmake命令,所以这个变量也就等同于build目录

生成命名存放库文件,add_library,set_target_properties函数,LIBRARY_OUTPUT_PATH 系统变量使用set该白你

add_library(lib_name STATIC/SHARED src) //添加动态库,指定生成静态库或动态库。src:源文件

函数作用:生成库。

参数lib_name:是要生成的库名称,文件为liblib_name.so 或者liblib_name.a(静态库)。

参数STATIC/SHARED:指定生成静态库或动态库,

参数src:指明库的生成所需要的源文件

set_target_properties重新定义了库的输出名称,如果不使用set_target_properties也可以,那么库的名称就是add_library里定义的名称。具体可以参考官方文档。

LIBRARY_OUTPUT_PATH 是cmake系统变量,项目生成的库文件都放在这个目录下。这里我指定库生成到lib目录。 开始编译

  1. 在build目录下执行 cmake .:根据CMakeLists.txt构建生成makefile。

  2. 在build目录下执行 make :使用makefile构建可执行程序。

  3. 查看lib目录下是否生成库文件。

出现库文件就算编译成功

七、链接库文件

  • EXECUTABLE_OUTPUT_PATH 是cmake系统变量,意思是生成的可执行文件的目录,这里把他改为bin目录,因此设生成的可执行文件会出现在bin目录中。

find_library(var lib_name lib_path1 lib_path2)

函数作用:查找库,并把库的绝对路径和名称存储到第一个参数里

参数var:用于存储查找到的库

参数lib_name:想要查找的库的名称,默认是查找动态库,想要指定查找动态库或静态库

可以加后缀,例如 funcname.so 或 funcname.a

参数lib_path:想要从哪个路径下查找库,可以指定多个路径

target_link_libraries(target lib_name)

函数作用:把库lib_name链接到target可执行文件中

八、添加编译选项:

add_compile_options(-std=c++11,-wall, -O2)

程序启动流程:

1) 加载可执行文件
  • 操作系统首先将可执行文件加载到内存中。

  • 这包括读取可执行文件的头部信息(如 ELF 文件头)以及分配内存空间。

(2) 解析动态链接器
  • 如果可执行文件依赖动态库(.so.dll),操作系统会调用动态链接器(如 Linux 上的 /lib64/ld-linux-x86-64.so.2)。

  • 动态链接器负责加载所有所需的动态库,并将它们映射到进程的地址空间中。

(3) 符号解析与重定位
  • 动态链接器会解析动态库中的符号表,找到程序中引用的函数和变量,并将它们与动态库中的实现关联起来。

  • 这一过程称为 符号解析地址重定位

(4) 运行全局构造函数
  • 在 C++ 中,如果存在全局对象或静态对象,它们的构造函数会在 main() 函数之前被调用。

  • 这些构造函数的代码可能也依赖于动态库,因此需要在动态库加载完成后才能执行。

(5) 调用 main() 函数
  • 完成上述所有准备工作后,控制权才会转移到 main() 函数,程序的逻辑才开始执行。

核心就是目标和依赖。

使用vscode配合构建并调试:

1、核心就是launch.json指定可执行文件,如果需要构建的话:pretask指定task.json文件的任务。tasks.json中需要指定构建命令,自己可以选择makefile,或者CMAKE的命令行,或者直接gcc 指定参数等等。

相关推荐
私人珍藏库6 小时前
[吾爱大神原创工具] QtScreenSwitcher[Win]一个现代化、极简、高颜值的多屏开关工具。
windows·工具·软件·win·多功能
competes6 小时前
慈善基金投资底层逻辑应用 顶层代码低代码配置平台开发结构方式数据存储模块
java·开发语言·数据库·windows·sql
零号全栈寒江独钓8 小时前
基于c/c++实现linux/windows跨平台获取ntp网络时间戳
linux·c语言·c++·windows
dyxal15 小时前
内网 Windows 离线安装 uv:极速 Python 包管理器的部署实战
windows·python·uv
stone082315 小时前
如何解决Windows硬盘变成了空白
windows
零号全栈寒江独钓16 小时前
基于c/c++实现linux/windows跨平台ntp时间戳服务器
linux·c语言·c++·windows
舒一笑16 小时前
Windows 下执行 pnpm install 报 EBUSY: resource busy or locked,我最后用这一招解决了
前端·windows·程序员
hERS EOUS17 小时前
Redis 下载与安装 教程 windows版
数据库·windows·redis
爱吃香蕉的阿豪18 小时前
Mac 远程操作 Windows 开发:ZeroTier + JetBrains 实战指南
windows·macos·zerotoer
YJlio19 小时前
2026年4月18日60秒读懂世界:从神舟二十号出舱到L2新国标公示,今天最值得关注的6个信号
windows·python·django·计算机外设·电脑·outlook·eixv3