千家信息网

自动化构建系统CMake怎么用

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要为大家展示了"自动化构建系统CMake怎么用",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"自动化构建系统CMake怎么用"这篇文章吧。CMak
千家信息网最后更新 2026年11月03日自动化构建系统CMake怎么用

这篇文章主要为大家展示了"自动化构建系统CMake怎么用",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"自动化构建系统CMake怎么用"这篇文章吧。

CMake 是一个跨平台的自动化构建系统,它使用一个名为 CMakeLists.txt 的文件来描述构建过程,可以产生标准的构建文件,如 Unix 的 Makefile 或Windows Visual C++ 的 projects/workspaces 。

例1:Hello World

源代码只有一个文件HelloWorld.cpp

#includeint main(int argc, char *argv[]){  std::cout "Hello World!" return 0;}123456

CMakeLists.txt也只有三行而已(使用cmake管理项目的过程,也就是编写CMakeLists.txt的过程)

cmake_minimum_required(VERSION 2.8.9)project (hello)add_executable(hello helloworld.cpp)123

第一行用于指定cmake最低版本 第二行指定项目名称(这个名称是任意的) 第三行指定编译一个可执行文件,hello是第一个参数,表示生成可执行文件的文件名(这个文件名也是任意的),第二个参数helloworld.cpp则用于指定源文件。

如果您电脑上已经安装了cmake,那么我们就已经完事具备了。 第一步,用cmake生成Makefile文件

  • 注:cmake命令后边跟的就是CMakelist.txt所在的目录,这个目录不必是当前目录,你也可以新建一个build目录或者其他名字的目录来生成build文件,实际项目中也都是这么做的,这样代码会很干净也便于git管理. 第二步,make编译程序 && 编译成功 通过上一步我们发现,当前目录下已经多出了几个文件,特别是Makefile文件 第三步,测试程序 到此,第一个用cmake管理的程序,成功了!

例2: 包含目录结构的项目

在例1中完全体现不出cmake的任何优势,用g++一行可以解决的问题我们绕了一大圈。可是cmake本来的优势就是管理庞大的项目的。 这个例子用最小的程序来体现一个带目录结构的项目。其中有源文件目录,头文件目录。

cmake_minimum_required(VERSION 2.8.9)project(directory_test)#Bring the headers, such as Student.h into the projectinclude_directories(include)#Can manually add the sources using the set command as follows:#set(SOURCES src/mainapp.cpp src/Student.cpp)#However, the file(GLOB...) allows for wildcard additions:file(GLOB SOURCES "src/*.cpp")add_executable(testStudent ${SOURCES})12345678910111213

和第一个例子比起来,CMakelist.txt有如下改变:

  1. 使用include_directories() 包含头文件目录
  2. 使用set(SOURCES … ) 或GLOB (or GLOB_RECURSE) 设置源文件SOURCES
  3. add_executable 使用变量SOURCES ,而不是具体的文件名 接下来的步骤就和例子1一样了,不同之处是我们新建了一个build目录来存储编译中间文件,如下图:
  4. 下一步make,然后运行结果如下:

例3:动态库编译(.so)

有了前两个例子的基础,接下来的例子我们只需要看一下目录结构和CMakelist.txt.

CMakelist.txt如下:

project(directory_test)set(CMAKE_BUILD_TYPE Release)#Bring the headers, such as Student.h into the projectinclude_directories(include)#However, the file(GLOB...) allows for wildcard additions:file(GLOB SOURCES "src/*.cpp")#Generate the shared library from the sourcesadd_library(testStudent SHARED ${SOURCES})#Set the location for library installation -- i.e., /usr/lib in this case# not really necessary in this example. Use "sudo make install" to applyinstall(TARGETS testStudent DESTINATION /usr/lib)123456789101112131415

两个重要变化:

  1. 我们不再使用add_executable() 而是使用add_library()
  2. install 指定安装目录,执行sudo make install时动态库将被安装在/usr/lib目录 如前两个例子,我们依次执行,cmake make编译结果如下:

例4:静态库编译 (.a)

基于例3,我们编译一个静态库

将CMakeList.txt修改为如下所示:

cmake_minimum_required(VERSION 2.8.9)project(directory_test)set(CMAKE_BUILD_TYPE Release)#Bring the headers, such as Student.h into the projectinclude_directories(include)#However, the file(GLOB...) allows for wildcard additions:file(GLOB SOURCES "src/*.cpp")#Generate the static library from the sourcesadd_library(testStudent STATIC ${SOURCES})#Set the location for library installation -- i.e., /usr/lib in this case# not really necessary in this example. Use "sudo make install" to applyinstall(TARGETS testStudent DESTINATION /usr/li12345678910111213141516

可以看出,只需将add_library中的shared改为static即可。 编译结果如下:


例5:使用静态库或动态库

下边我们来测试一下我们例3的结果,代码和CMakeList.txt如下:

#include"Student.h"int main(int argc, char *argv[]){  Student s("Joe");  s.display();  return 0;}1234567cmake_minimum_required(VERSION 2.8.9)project (TestLibrary)#For the shared library:set ( PROJECT_LINK_LIBS libtestStudent.so )link_directories( ~/exploringBB/extras/cmake/studentlib_shared/build )#For the static library:#set ( PROJECT_LINK_LIBS libtestStudent.a )#link_directories( ~/exploringBB/extras/cmake/studentlib_static/build )include_directories(~/exploringBB/extras/cmake/studentlib_shared/include)add_executable(libtest libtest.cpp)target_link_libraries(libtest ${PROJECT_LINK_LIBS} )123456789101112131415

结果如下(CMakeList.txt中的目录要根据自己的情况改一下):

成功了!!

以上是"自动化构建系统CMake怎么用"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

文件 目录 编译 例子 项目 结果 系统 自动化 程序 管理 成功 两个 内容 动态 文件名 篇文章 结构 过程 静态 生成 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 国智互联网科技 深圳恒合互联网络科技有限公司 高科技与互联网 互联网科技英文 奇酷互联网科技 小马过河互联网科技 云电互联网科技 互联网科技logo设计 成都仁贤领冠互联网科技有限公司 湖南洣水互联网科技有限公司扣款 玖二柒互联网科技公司待遇 互联网时代科技改变生活 互联网公司科技股 呼和浩特新华互联网科技学院 明优互联网科技有限公司 互联网方面的科技前沿 广东工业互联网大赛深圳学泰科技 互联网科技快讯热点 长沙易易互联网科技有限公司 互联网大会出现的黑科技 互联网科技行业发展 互联网品科技 美国互联网科技巨头监管 狮子座互联网科技培训 剑昆互联网络科技有限公司临桂 互联网科技革命什么开始 苏州铭阳互联网科技有限公司 上海京穆互联网科技有限公司 工业互联网科技成果转化 北京品多多互联网科技有限公司
0