当在Linux系统下编写程序时候,如果没有类似于visual studio、vs code等IDE(集成开发环境)时,如何编译、运行程序呢?一种方法是编写makefile文件,用makefile文件管理程序脚本之间的相互依赖关系,其语法相对比较复杂。另一种有效的方法就是利用cmake工具,自动生成makefile文件。

cmake是什么
CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。Linux/Ubuntu上基本都预先安装好了cmake工具,用sudo apt-get install也可以自动安装。要使用cmake必须在工程的每个文件夹中都编写CMakeLists.txt,尤其注意C、M、L是大写,并且是复数形式。

hello, world!
话不多说,下面给出利用cmake进行编译并运行程序的例子,首先在建立一个名为ex1的文件夹,在其中建立程序源文件main.cpp和CMakeLists.txt

#main.cpp
#include <iostream> int main() {
std::cout << "Hello, world!" << std::endl;
return ;
}
#CMakeLists.txt
PROJECT(hello_world)
ADD_EXECUTABLE(hello main.cpp)

解释下上面的CMakeLists.txt,第一句是指生成一个名为hello_world的工程;第二句为基于main.cpp生成名为hello的可执行文件,非常容易。

注意cmake的命令不区分大小写,但一般建议使用大写的,然后,cmake的注释为#。

在terminal中,将路径改为当前文件夹中,先后运行

$cmake .

$make

此时文件中,hello文件,hello文件是编译之后的输出文件。

$./hello

可以看到输出结果:

Hello, world!

out-of-source编译
上述编译方法有个很大的问题,原本文件中仅有源文件和CMakeLists.txt,但是编译之后,文件夹中的文件如下所示:
CMakeCache.txt  cmake_install.cmake  hello     Makefile

CMakeFiles      CMakeLists.txt       main.cpp

多了很多编译过程文件和结果文件,这样的方式显然是不方便的。如果能够把编译的过程文件和结果文件放在另一个文件夹,那么文件结构就比较清晰,可以方便地编辑、修改源文件。

建立ex2文件夹,并且在ex2中建立src文件夹,和build文件夹。

首先,在ex2文件夹中,建立CMakeLists.txt,第一行是建立名为hello_world的工程,第二行添加src子文件夹

#CMakeLists.txt
PROJECT(hello_world)
ADD_SUBDIRECTORY(src)

然后,进入src文件夹,建立CMakeLists.txt,基于main.cpp生成名为hello的目标文件。

ADD_EXECUTABLE(hello main.cpp)

同样,main.cpp与上面相同

#main.cpp
#include <iostream> int main() {
std::cout << "Hello, world!" << std::endl;
return ;
}

然后,进入ex2/build文件夹,在terminal中

$cmake ..
$make

对程序进行编译,编译完成后,在build文件夹中生成了编译文件和src文件,src文件夹中有hello的结果文件,进入src文件夹中,在terminal中

$./hello

可以看到输出结果,说明编译正确

Hello, world!

cmake编译c++程序的更多相关文章

  1. cmake 编译windows程序

    cmake 编译windows程序 cmake 编译windows程序 cmake 编译windows程序 尽量使用  尽量使用 尽量使用 https://www.cnblogs.com/liujia ...

  2. CMake编译Qt程序+UI+Resources

    今天给大家讲解一下Cmake如何编译Qt程序. 这里说的Qt程序不只是用QtCreator写出来的程序,当然也可以是文本编辑器….这里说的Qt程序是指,QCoreApplication,QApplic ...

  3. linux 下 VSCODE 使用CMake编译STM32程序

    项目在做什么 项目地址 本项目是为了研究MCU在linux下开发而做的 --build 存放cmake编译生成的文件 --cmake 存放cmake编译时会用到的文件,比如工具链检查.编译选项等 -- ...

  4. Ubuntu下Cmake编译C++程序Helloworld

    1.首选新建工程目录 mkdir helloworld 2.新建文件目录 cd helloworld mkdir bin mkdir lib mkdir src mkdir include mkdir ...

  5. CMake编译Widget UI Qt程序

    自从CMake被引入到KDE项目的编译系统中后,CMake的使用者日益增多,Qt也不例外,除了使用QMAKE编译Qt程序外,也可以使用CMake来编译Qt程序,并且CMake在使用上更灵活,特别是大型 ...

  6. Ubuntu系统---编译opencv程序的几种方式g++、Makefile、Cmake

    Ubuntu系统---编译opencv程序的几种方式g++.Makefile.Cmake 先建立一个工程(一个文件夹),写好xxx.cpp文件,可以是多个: //----------opencv.cp ...

  7. Windows下使用mingw+cmake编译C/C++程序

    按照正常流程安装好mingw和cmake后,仍然是无法直接使用cmake编译处MakeFile文件的,我们需要在CMakeLists.txt中做一些配置. 首先,在PROJECT之前,设置: SET( ...

  8. linux 下cmake 编译 ,调用,调试 poco 1.6.0 小记

    上篇文章 小记了: 关于 Poco::TCPServer框架 (windows 下使用的是 select模型) 学习笔记. http://www.cnblogs.com/bleachli/p/4352 ...

  9. [C] c99int(让VC等编译器自动兼容C99的整数类型)V1.02。源码托管到github、添加CMake编译配置文件、使用doxygen规范注释

    新版本—— http://www.cnblogs.com/zyl910/p/zlstdint_v100.html[C] zlstdint(让VC.TC等编译器自动兼容C99的整数类型)V1.0.支持T ...

随机推荐

  1. Spring JdbcTemplate实例

    1.常用方法 * update():执行DML语句.增.删.改语句* queryForMap():查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个map集合 ...

  2. FSCalendar使用和注意事项

    相信大家项目中或多或少都有日历这一块的内容吧,公司作为教育行业的软件公司,当然也是一定有的. 最近被日历这一块的内容弄得很头疼啊,改来改去的,不过还是学到了很多东西,至少FSCalendar的使用基本 ...

  3. 【HANA系列】SAP HANA SQL从给定日期中获取月份

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA SQL从给定日 ...

  4. Java入门第一季学习总结

    一.课程总概 这门课程的学习难度属于入门级别,又由于有c++的基础,所以学习这门课程也是比较轻松的.可以简单地把这门课的学习分为四部分:第一部分,java的介绍(第一章):第二部分,java的数据类型 ...

  5. GIT命令总结,so easy

    一:GIT命令实战(码云) https://oschina.gitee.io/learn-git-branching/ 提交 git commit 创建分支 git branch <name&g ...

  6. Linux 概念与快捷方式

    概念 何为shell Shell 是指"提供给使用者使用界面"的软件(命令解析器),类似于 DOS 下的 command(命令行)和后来的 cmd.exe .普通意义上的 Shel ...

  7. 在Ubuntu上安装Hive

    1.下载hive2.3.5 解压缩并改名为hive目录,放到/usr/local下(注意权限) sudo mv apache-hive-2.3.5-bin /usr/local/hive 2.修改目录 ...

  8. CentOS 7 配置 kcptun 实现网站加速

    目的:shadowsocks+kcptun 实现vpn加速(shadowsocks,kcptun在同一台VPS上) 一.shadowsocks安装(参考  https://www.cnblogs.co ...

  9. Laravel-admin form 表单是增加或者修改

    Laravel-admin 实现 form 表单是增加或者修改的三种方法,应用情景:1.新增或者修改 form 展示的表单不同:2.新增或者保存前后回调进行其他的操作 1. use Illuminat ...

  10. deepin 15.10.1 GTX1060 NVIDIA 驱动安装,双屏显示问题记录

    有一段时间没有用Linux了.由于买了个4k的戴尔显示屏,在deepin系统上无法用,从昨晚到现在,总于解决了我的问题! 问题1:无法直接在深度的显卡驱动管理器哪里直接切换,网上看到很多人都有这个问题 ...