CMake

CMake学习笔记

文章目录

  • 前言
  • 一、Cmake是什么?
  • 二、C++编译过程?
    • 预处理
    • 编译
    • 汇编
    • 链接
  • 三、静态链接库和动态链接库
  • 四、部分代码
    • 1.写⼀个HelloWord
    • 2.编写CMakeLists.txt
    • 3.根据项目中的CMakeLists.txt生成构建系统文件
    • 4.进行项目构建和编译
    • 5.构建动态库和静态库的CMakeLists.txt文件
    • 6.安装 install
  • 五、语法解析
    • PROJECT关键字
    • SET关键字
    • MESSAGE关键字
    • ADD_EXECUTABLE
    • PUBLIC PRIVATE INTERFACE
    • 流程控制
    • 宏和函数
  • 总结


前言

CMake 学习笔记

一、Cmake是什么?

Cmake是用于构建,测试和软件打包的开源跨平台工具(不是包或者语言)。

二、C++编译过程?

预处理(preprocess)–>编译(complie)–>汇编(assemble)–>链接(link)

.cpp–>C++ preprocess–>Complier–>.s–>.o/.obj–>Linker–>Executable file

预处理

C++中的预处理指令以#开头。预处理指令在程序编译之前被处理,用于告诉编译器在编译过程中要进行的一些操作。常见的预处理指令有#include、#define、#ifdef等,它们可以用来包含头文件、定义宏、进行条件编译等。

g++ -E main.cpp -o main.i

编译

检查代码规范性和语法错误等,检查完毕把代码翻译成汇报语言文件。

g++ -S main.i -o main.s

汇编

汇编文件首先需要通过汇编器将其转换成二进制格式的目标文件。

g++ -c main.s -o main.o

链接

链接器将一个或多个目标文件合并成一个可执行文件,将目标代码与所依赖库文件进行关联。

g++ main.o -o main

三、静态链接库和动态链接库

静态链接库和动态链接库区别在于链接阶段不一样。静态链接库是在编译过程进行链接,在运行时内存中会有多份static library;动态链接库是在执行过程中进行链接,在运行时内存中只有一份shared library。

  • 静态库的扩展名⼀般为“.a”或“.lib”;动态库的扩展名⼀般为“.so”或“.dll”。
  • 静态库在编译时会直接整合到⽬标程序中,编译成功的可执行文件可独立运⾏。
  • 动态库在编译时不会放到连接的⽬标程序中,即可执行文件⽆法单独运行。

四、部分代码

1.写⼀个HelloWord

#include 
int main()
{
std::cout << "hello word" << std::endl;
return 0;
}

2.编写CMakeLists.txt

代码如下:

Cmake_minimum_required(VERSION 3.20.0) #最小版本
project(Hello)#项目名
add_executable(Hello main.cpp)#由源文件生成一个可执行程序

3.根据项目中的CMakeLists.txt生成构建系统文件

代码如下:

cmake -B build

创建一个build并在此目录下生成makefile或其他文件,构建文件定义了编译源代码链接库,生成可执行文件等配置信息。

4.进行项目构建和编译

cmake --build build

5.构建动态库和静态库的CMakeLists.txt文件

cmake_minimum_required(VERSION 3.20.0)

project(Hello)

#添加静态库
add_library(slib STATIC src/slib.cpp include/slib.h)
target_include_directories(slib PUBLIC include)

#添加动态库
add_library(dlib SHARED src/dlib.cpp include/dlib.h)
target_include_directories(dlib PUBLIC include)

#添加可执行文件
add_executable(${PROJECT_NAME} main.cpp)

#链接库
target_link_libraries(${PROJECT_NAME} slib dlib)

6.安装 install

install(
	TARGETS ${PROJECT_NAME} slib dlib
	RUNTIME DESTINTION bin #可执行文件
	LIBRARY DESTINATION lib #动态库
	ARCHIVE DESTINATION lib #静态库
)

#[[
运行方式
cmake -B build -DCMAKE_INSTALL_PREFIX='安装路径'
cmake --build build
cmake --install build
]]

五、语法解析

PROJECT关键字

PROJECT (HELLO) 指定了⼯程的名字,并且⽀持所有语⾔—建议
PROJECT (HELLO CXX) 指定了⼯程的名字,并且⽀持语⾔是C++
PROJECT (HELLO C CXX) 指定了⼯程的名字,并且⽀持语⾔是C和C++

SET关键字

⽤来显示的指定变量的
SET(SRC_LIST main.cpp) SRC_LIST变量就包含了main.cpp
也可以 SET(SRC_LIST main.cpp t1.cpp t2.cpp)

MESSAGE关键字

向终端输出⽤户⾃定义的信息

ADD_EXECUTABLE

ADD_EXECUTABLE(HELLO hello.cpp)
注意:⼯程名的 HELLO 和⽣成的可执⾏⽂件 hello 是没有任何关系的

PUBLIC PRIVATE INTERFACE

示例:target_link_library(A,B)
PUBLIC:
B link A ,如果 C link A,则C link B
B 用于A的实现,也在头文件中给C用
PRIVATE:
依赖项B仅连接到目标A,如果C link A ,C也不会link B
B仅用于A的实现,不在头文件中给C用
INTERFACT:
B 没link A ,如果 C link A ,C也不会link B
B不用于A的实现,但在头文件中接口给C用

流程控制

if条件

if(<condition>)
<commands>
elseif(<condition>)
<commands>
else()
<commands>
endif()

loop循环流程控制(for/while)
For

foreach(<loop_var>RANGE<max>)
<commands>
endforeach()

宏和函数

宏:在编译阶段进行文本替换
函数:在执行阶段调用,是一段可以在程序中被重复调用的代码块

macor(<name>[<argument>...]
<commands>
endmacro()
function(<name>[<argument>...]
<commands>
endfunction()

总结

对Cmake基础知识简单总结,后续会继续补充。

参考视频链接: link

你可能感兴趣的:(c++,开发语言)