当在Linux系统下编写程序时候,若是没有相似于visual studio、vs code等IDE(集成开发环境)时,如何编译、运行程序呢?一种方法是编写makefile文件,用makefile文件管理程序脚本之间的相互依赖关系,其语法相对比较复杂。另外一种有效的方法就是利用cmake工具,自动生成makefile文件。ios
cmake是什么
CMake是一个跨平台的安装(编译)工具,能够用简单的语句来描述全部平台的安装(编译过程)。Linux/Ubuntu上基本都预先安装好了cmake工具,用sudo apt-get install也能够自动安装。要使用cmake必须在工程的每一个文件夹中都编写CMakeLists.txt,尤为注意C、M、L是大写,而且是复数形式。工具
hello, world!
话很少说,下面给出利用cmake进行编译并运行程序的例子,首先在创建一个名为ex1的文件夹,在其中创建程序源文件main.cpp和CMakeLists.txtui
#main.cpp #include <iostream> int main() { std::cout << "Hello, world!" << std::endl; return 0; }
#CMakeLists.txt
PROJECT(hello_world)
ADD_EXECUTABLE(hello main.cpp)
解释下上面的CMakeLists.txt,第一句是指生成一个名为hello_world的工程;第二句为基于main.cpp生成名为hello的可执行文件,很是容易。spa
注意cmake的命令不区分大小写,但通常建议使用大写的,而后,cmake的注释为#。code
在terminal中,将路径改成当前文件夹中,前后运行blog
$cmake . $make
此时文件中,hello文件,hello文件是编译以后的输出文件。开发
$./hello
能够看到输出结果:terminal
Hello, world!
out-of-source编译
上述编译方法有个很大的问题,本来文件中仅有源文件和CMakeLists.txt,可是编译以后,文件夹中的文件以下所示:
CMakeCache.txt cmake_install.cmake hello Makefileget
CMakeFiles CMakeLists.txt main.cppio
多了不少编译过程文件和结果文件,这样的方式显然是不方便的。若是可以把编译的过程文件和结果文件放在另外一个文件夹,那么文件结构就比较清晰,能够方便地编辑、修改源文件。
创建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 0; }
而后,进入ex2/build文件夹,在terminal中
$cmake .. $make
对程序进行编译,编译完成后,在build文件夹中生成了编译文件和src文件,src文件夹中有hello的结果文件,进入src文件夹中,在terminal中
$./hello
能够看到输出结果,说明编译正确
Hello, world!