编译C/C++文件时,很多时候都是直接使用像 gcc main.c
或者 g++ main.cpp
这样的命令编译的。但是代码文件多了后,这样编译就很困难了。这时候 就出现了MakeFile
这个工具。
MakeFile 解决了多个文件编译难的问题,有了MakeFile,只需要在MakeFile的目录中 运行一下make
命令, 编译就会自动完成。但是编写MakeFile又很啰嗦,于是聪明的程序员们有开发了一个工具,自动生成MakeFile 文件,cmake
的作用就是自动生成MakeFile。毕竟写cmake要比写MakeFile要简单很多
也许你会说,现在都是用IDE写代码,IDE都会自动自动编译和运行,我还学这些干啥。但是有时候需要服务器上编译项目,或者在没有IDE的机器上编译项目,这时候MakeFile就很有用了。其实很多IDE也是使用cmake完成编译的,比如 clion
cmake 安装
在linux上可以使用源码安装和包管理安装,一般直接用包管理安装就好了
Ubuntu和Debiansudo apt-get install cmake
CentOSsudo yum install cmake
因为cmake只是生成MakeFile,最终组织编译的还是MakeFile,所以还有安装make
make 一般都会预装,为了保险,还是装一下
Ubuntu和Debiansudo apt-get install make
CentOSsudo yum install make
cmake基本规则
cmake 也没啥神秘的,本质上也是根据一定的规则自动生成MakeFile的,也是有语法的
#
是注释符号
预定义变量
PROJECT_NAME
项目名称PROJECT_SOURCE_DIR
工程的根目录PROJECT_BINARY_DIR
执行cmake命令的目录PROJECT_BINARY_DIR
执行cmake命令的目录CMAKE_CURRENT_SOURCE_DIR
当前CMakeLists.txt文件所在目录CMAKE_C_FLAGS
设置C编译选项CMAKE_CXX_FLAGS
设置C++编译选项CMAKE_C_COMPILER
设置C编译器CMAKE_CXX_COMPILER
设置C++编译器EXECUTABLE_OUTPUT_PATH
设置编译后可执行文件目录LIBRARY_OUTPUT_PATH
设置生成的库文件目录
常用规则
cmake_minimum_required(VERSION 3.16)
指令cmake 版本project(hello_world)
设置工程名include_directories(${PROJECT_SOURCE_DIR}/include)
添加头文件路径link_directories(${PROJECT_SOURCE_DIR}/lib)
添加链接库的路径add_subdirectory(module)
添加 module 子目录, 此目录下也要有CMakeLists.txt文件add_executable(project1 main.c)
指定编译的可执行文件add_library(lib1 SHARED library.c library.h)
指定生成的库文件,SHARED是生成动态库,STATIC后生成静态库add_compile_options()
添加编译选项target_link_libraries()
指定动态链接库install()
指定make install的目录
set(XXXX YYYYYY)
用于设置和修改变量${XXXX}
使用变量
构建一个简单的项目
只有一个 main.c
文件
CMakeList.txt
cmake_minimum_required(VERSION 3.15)
project(project1 C)
set(CMAKE_C_STANDARD 99)
add_executable(project1 main.c)
main.c
#include <stdio.h>
int main() {
printf("Hello, CMakeList!\n");
return 0;
}
编译一个debug版本
mkdir debug
新建debug目录cd debug
进入debug目录cmake -DCMAKE_BUILD_TYPR=debug ..
指定编译模式为debugmake
生成可执行文件
此时会生成project1
文件
步骤 3 中 cmake -DCMAKE_BUILD_TYPE=release ..
指定编译模式为release
构建一个生成动态库的项目
有两个文件library.h
和library.c
CMakeList.txt
cmake_minimum_required(VERSION 3.15)
project(shared C)
set(CMAKE_C_STANDARD 99)
add_library(shared SHARED library.c library.h)
library.h
int add(int a, int b);
library.c
int add(int a, int b) {
return a + b;
}
生成动态库
mkdir lib
新建lib目录cd lib
进入lib目录cmake -DCMAKE_BUILD_TYPE=debug ..
指定编译模式为debugmake
生成可执行文件
此时会生成libshared.so
文件
在第一个项目中使用动态库
首先把 libshared.so
文件和library.h
文件复制到第一个项目中
修改 CMakeList.txt
cmake_minimum_required(VERSION 3.15)
project(project1 C)
set(CMAKE_C_STANDARD 99)
add_executable(project1 main.c)
target_link_libraries(project1 ${PROJECT_SOURCE_DIR}/libshared.so)#指定动态库文件
mkdir debug
新建debug目录cd debug
进入debug目录cmake -DCMAKE_BUILD_TYPE=debug ..
指定编译模式为debugmake
生成可执行文件
最终目录如图

把两个项目合成一个
能不能在一个项目中生成动态库并在这个项目中使用呢,当然是可以的。
也就是在这个项目中部分文件编译成动态库 .so 文件, 部分文件编译成 可执行文件
修改 CMakeList.txt
cmake_minimum_required(VERSION 3.13.3)
project(project1 C)
set(CMAKE_C_STANDARD 99)
add_library(shared SHARED library.h library.c)
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)#设置动态库输出目录
add_executable(project1 main.c)
target_link_libraries(project1 shared)
mkdir debug
新建debug目录cd debug
进入debug目录cmake -DCMAKE_BUILD_TYPE=debug ..
指定编译模式为debugmake
生成可执行文件
最终目录如图

最后
通过几个简单的例子,介绍了一下cmake的基本使用,文中是使用cmake构建的C项目,换成C++基本没什么区别,就不展示了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2013-11-22 MFC自绘控件学习总结
2013-11-22 用Visual C++设计“精灵”窗体
2013-11-22 使用Win32 API创建不规则形状&带透明色的窗口
2013-11-22 [用UpdateLayeredWindow实现任意异形窗口]
2013-11-22 C++ 100款开源界面库 (10)
2013-11-22 【【【超高仿】】】迅雷播放器教程 -- 总结(14)
2013-11-22 计算机视觉、机器学习相关领域论文和源代码大集合