与CMake相遇

做C/C++的人都应该经历过,以往拿到一个开源代码,想自己编译出来,总会因为VS的版本不同而出现各种各样的问题,使编译过程困难重重,更多时候就会放弃使用它了。而这个过程反过来,也会使用一些开源项目难于推广。

另外,基于我的跨平台开发经历,更是一个灾难。刚毕业那会,我有一个项目是Windows下开发,但服务器是Ubuntu的,当初我是在windows下的VS2015开发,调试得没问题了,还要上传到服务器,再根据其环境写各种makefile

两年前吧,接触到OpenCV,看到里面竟然是使用CMakeLists.txt这个脚本,通过CMake程序就可以生成相应平台的编译工程了,简直太方便了。

CMake的HelloWorld

文件结构

helloworld
|--CMakeLists.txt
|--helloworld.cpp

CMakeLists.txt

 # CMake 最低版本号要求
cmake_minimum_required(VERSION 3.0) # 指定项目名称,其实就是给变量PROJECT_NAME赋值
project(HelloWorld) # 查找指定目录下的所有源文件 并存放到指定变量名SRC中
aux_source_directory(. SRC) # 指定生成目标
add_executable(${PROJECT_NAME} ${SRC}

helloworld.cpp

因为现在的工作基本上是windows下的VS开发,所以我对于源文件与头文件的编写都会用CMake生成后,在VS里面再编写。

生成VS解决方案

CMake中

在选择【Specify the generator for this project】时,要注意一下所选的编译平台是32位还是64位的,若需要两种平台的则要创建两个解决方案的。

结果

总结

缺点

  1. 需要学习如何编写CMakeLists.txt,需要一点点学习成本;
  2. 每次添加源文件或头文件等,需要在源码文件夹下创建,可能还需要修改一下CMakeLists.txt,再到CMake中生成一下,不可直接在VS里添加哦!1
  3. 在这个章节中的实例中,使用的一些文件还是很初级的,如aux_source_directory函数只能查找源文件,头文件就没法添加到解决方案里,这给后期的修改带来了不小的麻烦,后期会再详说;
  4. 暂时没有了。

优点

  1. 实现了跨平台编译的管理,不需要再重复编写大量的编译脚本了。个人用起来还是很方便的
  2. 实现在使用Git或SVN时,对代码文件的纯洁管理,不会被提交与代码无关的工程文件(这是我个人的强迫症,被治愈了)

此纯属个人学习笔记,有错可以指正!

[CMake笔记] 初识CMake的更多相关文章

  1. CMake学习笔记一:初识cmake

    1 cmake简介 1.1 背景知识 cmake 是 kitware 公司以及一些开源开发者在开发几个工具套件(VTK)的过程中衍生品,最终形成体系,成为一个独立的开放源代码项目.项目的诞生时间是 2 ...

  2. cmake笔记

    注:cmake .   当前文件夹(一个点)   cmake .. 父目录(两个点) 例子一 一个经典的C程序,如何用cmake来进行构建程序呢? //main.c #include <stdi ...

  3. Cmake实践(Cmake Practice)第一部分

    参考资料地址:https://github.com/Akagi201/learning-cmake/blob/master/docs/cmake-practice.pdf 一.初识cmake 1. C ...

  4. 【转载】CMake 简介和 CMake 模板

    转载自我的博客: CMake 简介和 CMake 模板 . 如果你用 Linux 操作系统,使用 cmake 会简单很多,可以参考一个很好的教程: CMake 入门实战 | HaHack .如果你用 ...

  5. mysqlQL 5.7 安装报错CMake Error at cmake/boost.cmake:81 (MESSAGE)

    CMake Error at cmake/boost.cmake:81 (MESSAGE): You can download it with -DDOWNLOAD_BOOST=1 -DWITH_BO ...

  6. 《Go并发编程实战》读书笔记-初识Go语言

    <Go并发编程实战>读书笔记-初识Go语言 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在讲解怎样用Go语言之前,我们先介绍Go语言的特性,基础概念和标准命令. 一. ...

  7. CMake Error at cmake/OpenCVUtils.cmake

    CMake Error at cmake/OpenCVUtils.cmake:1047 (message): Failed to download . Status= Call Stack (most ...

  8. Python笔记初识

    Python笔记初识

  9. Phython笔记初识

    Phython笔记初识   Python 1898 第一版本 1991 荷兰人 Guido  协议 Gpl                     动态语音类型  

随机推荐

  1. Bugku-CTF加密篇之告诉你个秘密(ISCCCTF)

    告诉你个秘密(ISCCCTF)   636A56355279427363446C4A49454A7154534230526D6843 56445A31614342354E326C4B4946467A5 ...

  2. JAVA基础学习(3)之循环

    3循环 3.1循环 3.1.1循环 一直要做的行为进行循环 3.1.2数数字 while(){}判断是否进行 数数字:number/10 //数数字Scanner in = new Scanner(S ...

  3. IS加载JSON 和 MP4文件 错误 404 提示 需要添加mime映射(默认IIS Express里没有映射)

    问题描述 在发布项目的时候,有一些文件是json文件,在网页中进行加载,但是在IIS7发布的时候,json文件居然是404,无法找到,在URL上输入地址也一样. 错误原因 IIS内部机制,不支持直接访 ...

  4. utf-8无bom格式编码

    BOM——Byte Order Mark,就是字节序标记 在UCS 编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF.而FFFE在U ...

  5. Spark性能调优-基础篇

    前言 在大数据计算领域,Spark已经成为了越来越流行.越来越受欢迎的计算平台之一.Spark的功能涵盖了大数据领域的离线批处理.SQL类处理.流式/实时计算.机器学习.图计算等各种不同类型的计算操作 ...

  6. c#本地缓存当数据库表更改时,缓存失效。

    web.config <?xml version="1.0" encoding="utf-8"?> <!-- 有关如何配置 ASP.NET 应 ...

  7. 2019牛客暑期多校训练营(第七场)A String (字符串的最小表示)

    思路 这题思路如果是递归的话,应该是比较正确的.但是实际上只用切割两次就可以了. 先把原串从后向前切割一次,再把每一部分切割一次. 切两次的思路实际上是有漏洞的. 递归的思路,终点是,如果串长为1,或 ...

  8. PyQt5剪切板操作

    1.使用剪切板import sys,mathfrom PyQt5.QtWidgets import *from PyQt5.QtGui import *from PyQt5.QtCore import ...

  9. SprintBoot学习(二)

    Spring Boot的入口类 1.名为xxxApplication的就是入口类,在main方法中使用SpringApplication.run(SpringBootTestApplication.c ...

  10. Thread线程

    1.什么是线程? 线程( Thread ) 被称作轻量级进程( Lightweight Process ),线程是比进程更小一级的执行单元. 一个进程可以有多个线程,但至少有一个线程(当进程被初始化后 ...