什么是CMake

CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的“C++”特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CMakeLists.txt。Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是 CMake 和 SCons 等其他类似系统的区别之处。


在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下:

1.编写 CMake 配置文件 CMakeLists.txt 。

2.执行命令 cmake PATH 或者 ccmake PATH 生成 Makefile ccmake和cmake 的区别在于前者提供了一个交互式的界面 其中, PATH 是 CMakeLists.txt 所在的目录。

3.使用 make 命令进行编译。


本人在使用JetBrains公司的clion时发现有时候代码本身没有问题,但是一旦编译运行就会报类似于这样的错误:

undefined reference to `split(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
collect2.exe: error: ld returned 1 exit status

明明调用的是内部的语法,但是却报错了,经过一番百度,发现是clion中的CMakeLists.txt文件内容出现了一点问题,因此我们有必要稍微学习一下简单的CMakeLists.txt 配置文件的编写。


入门案例

单个源文件:main.cpp

编写CMakeLists.txt

#CMake最低版本号要求
cmake_minimum_required(VERSION 3.12)
#项目信息
project(chapter5_01)
#使用C++ 11标准
set(CMAKE_CXX_STANDARD 11)
#指定生成目标
add_executable(chapter5_01 main.cpp)

CMakeLists.txt 的语法比较简单,由命令、注释和空格组成,其中命令是不区分大小写的。符号 # 后面的内容被认为是注释。命令由命令名称、小括号和参数组成,参数之间使用空格进行间隔。

对于上面的CMakeLists.txt文件,依次出现了如下几个命令:

1.cmake_minimum_required :指定运行此程序所需要的CMake的最低版本

2.project :参数为:'chapter5_01',表示该项目名称是:chapter5_01

3.set:参数为:CMAKE_CXX_STANDARD 11,表示:设置C++标准为 C++ 11

4.add_executable:参数为:chapter5_01main.cpp,表示:将名为main.cpp的文件编译为名为chapter5_01的可执行文件

进阶案例

同一目录,多个源文件:main.cpp intercept.cpp intercept.h

编写CMakeLists.txt

#CMake最低版本号要求
cmake_minimum_required(VERSION 3.12)
#项目信息
project(chapter5_01)
#使用C++ 11标准
set(CMAKE_CXX_STANDARD 11)
#指定生成目标
add_executable(chapter5_01 main.cpp intercept.cpp)

对于该CMakeLists.txt文件,不同之处在于add_executable的参数,新增加了intercept.cpp,因为我们在源文件中用到了该文件


在上面我们所说的问题很有可能就是这里出现了问题,当你在创建了一个新的源文件时,clion的CMakeLists.txt文件没有更新,这是我们只需要手动添加这些文件到add_executable的参数里就可以了


最新文章

  1. [No000099]软件版本命名规范
  2. List tuple 类型转成数组
  3. [译]SQL Server分析服务的权限配置
  4. SQL Server Reporting Services (SSRS): Reporting Services in SQL Server 2012 (codename &quot;Denali&quot;) will support XLSX, DOCX formats. Bye bye 65536 rows limit in XLS files ;)
  5. TortoiseSVN常用操作说明
  6. TNetHTTPClient演示
  7. Python之路【第十篇】:HTML -暂无等待更新
  8. 如何:在 StackPanel 和 DockPanel 之间进行选择
  9. GridView出现不完整--GridView删除滚动条
  10. microwindows Win32 API demo
  11. mysql 初始化
  12. uml系列(三)——用例图
  13. muduo库整体架构简析
  14. jQuery UI 入门之实用实例
  15. mac下go环境搭建开发web工程
  16. Flink 集群运行原理兼部署及Yarn运行模式深入剖析
  17. localhost兼容js不能用
  18. Apache+Tomcat+Memcached实现会话保持
  19. Multiresolution Analysis(多分辨率分析)
  20. WPF ListView即时更新

热门文章

  1. Day6 - K - 陌上花开 HYSBZ - 3262
  2. Day4 - G - 确定比赛名次 HDU - 1285
  3. eshop6-nginx
  4. SSM 整合配置以及一个简单登陆案例(个人记录)
  5. Linux每日练习-awk命令的内外部变量传递20200225
  6. Java中默认方法
  7. P1057 数零壹
  8. x86平台inline hook原理和实现
  9. Spring课程 Spring入门篇 7-3 advice扩展
  10. hdu 3790 最短路径dijkstra(多重权值)