当在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. IPTV系统的VOD与TV业务性能测试

    IPTV的未来发展正在成为业界的焦点话题.据市场研究公司MRG的统计,全球IPTV用户将由2004年的200万增加至2010年的2000万,预计全球IPTV市场2005-2010年的复合增长率为102 ...

  2. Very important notes about Spring @Transnational(Srping事务注解 @Transnational重要注意事项)

    Sprint @Transnational is being ignored in the following cases: 1. when the caller method is calling ...

  3. Python web 项目的依赖管理工具

    Poetry可以帮助你声明.管理和安装Python项目的依赖项,确保你可以在任何地方都拥有正确的堆栈. Poetry支持Python 2.7 和Python 3以上 安装 Poetry提供了一个自定义 ...

  4. vue-cli 3.x 构建项目,webpack没有了?

    vue-cli 3.x 已经没有了webpack.config.js文件.取而代之的是创建一个vue.config.js文件.官网是这样介绍的 vue.config.js const path = r ...

  5. 5-1 标准I/O和管道

    标准I/O和管道 程序:指令+数据 读入数据:Input 输出数据:Output 打开的文件都有一个fd: file descriptor (文件描述符) Linux给程序提供三种 I/O 设备 标准 ...

  6. Nginx入门到实战

    location 语法 location 有”定位”的意思, 根据Uri来进行不同的定位. 在虚拟主机的配置中,是必不可少的,location可以把网站的不同部分,定位到不同的处理方式上. 比如, 碰 ...

  7. Linux C\C++基础——数组形参的使用

    1.数组形参 ]) void fun(int a[]) void fun(int *a) ],int n) void fun(char*p[],int n) void fun(char**p,int ...

  8. TensorFlow实战第七课(dropout解决overfitting)

    Dropout 解决 overfitting overfitting也被称为过度学习,过度拟合.他是机器学习中常见的问题. 图中的黑色曲线是正常模型,绿色曲线就是overfitting模型.尽管绿色曲 ...

  9. Emgu 学习(2) 视频文件播放

    播放AVI视频文件 static void Main(string[] args) { CvInvoke.NamedWindow("TestVideo", NamedWindowT ...

  10. CentOS7通过YUM安装MySQL5.6

    检查系统中的 MySQL,并删除现有的 Mysql 软件包. $ rpm -qa | grep mysql 这里如果没有返回任何东西证明没有安装任何 MySQL 相关的应用.如下图: 由于 cento ...