cmake基本命令
cmake与编译过程紧密相关,对编译过程进行了指定。
# 指定该cmake文件需要的最低cmake版本,因为低版本可能不支持某些语法
cmake_minimum_required(VERSION 3.18)
# 规定工程名
project(工程名)
# 定义变量,在之后可以使用${变量名}来表示路径
set(变量名 变量值)
# 设置cmake的c语言编译器和c++编译器,后面的clang和clang++是调用编译器的命令
set(CMAKE_C_COMPILER clang)
set(CMAKE_CXX_COMPILER clang++)
# 会产生一个由所有匹配globbing表达式的文件组成的列表,并将其保存到变量中,globbing表达式类似于正则表达式,但是比正则表达式更简单
file(GLOB 变量名 globbing表达式)
# 与GLOB类似,区别在于会遍历匹配目录的所有文件以及子目录下面的文件
file(GLOB_RECURSE 变量名 globbing表达式)
# 指定c++标准,并进行标准检查
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 添加编译选项,如-g -std=c++17 -O2
add_compile_options(编译选项)
# 头文件搜索路径
include_directories(头文件路径)
# 指定库文件基准路径,必须写在add_executable之前
link_directories(库文件基准路径)
# 生成可执行文件
add_executable(生成可执行文件名 要编译文件的路径1 要编译文件的路径2 ...)
# 链接库文件,必须写在add_executable之后
target_link_libraries(生成可执行文件名 库文件路径)
头文件
作用
头文件包含了函数声明、宏定义、类型定义等信息。它们用于在源代码文件中引入头文件中函数和变量的声明,以便编译器在编译时正确地解释源代码中引用的函数和变量。
形式
头文件通常包含在源代码文件中,通过#include
指令引入。对于C语言,头文件一般以.h作为扩展名;对于C++,可以没有扩展名,也可以以.h或者.hpp做扩展名。
库文件
作用
库文件是已经编译好的程序,它们包含了函数实现和其他需要的代码,使用库文件而不是源文件可以大大缩短编译时间。
库文件分为静态库和动态库:
- 静态库的作用是将目标程序所需的函数实现代码链接到目标程序中。编译器会在链接阶段查找并将引用的函数符号与库文件中的实现进行关联,生成最终的可执行文件。
- 动态库(共享库)在编译时并不会被直接包含到目标程序中,而是在运行时动态加载到内存中,但编译器需要知道动态库的位置和符号表等信息,以便在链接时生成正确的引用。
动态库的优点:
- 不同程序需要相同的库时,在内存中只需要有一份该共享库的拷贝,避免了空间浪费问题
- 并且在运行时才会被载入,也解决了静态库对程序的更新,部署和发布带来的麻烦。
形式
在Linux系统中,静态库的文件扩展名通常是.a,而动态库(共享库)的文件扩展名通常是.so。
在macOS系统中,静态库的文件扩展名通常是.a,而动态库的文件扩展名通常是.dylib。
在Windows系统中,静态库的文件扩展名通常是.lib,而动态库的文件扩展名通常是.dll。
编译时的作用
头文件和库文件共同构成了C语言中模块化编程的基础,允许开发者将代码分割成更小的模块,并在不同的项目中重用这些模块。
头文件在编译时告诉编译器如何正确解释源代码中的函数和变量,而库文件在编译时提供了函数的实现,以便将它们链接到目标程序中。这两者共同确保了源代码的正确编译和链接,生成最终可执行文件。