2016-09-29 67 views
3

1.cmake是来自CMake软件的命令:编译自动化系统; make和make install是Make软件的命令:构建自动化系统。了解CMake,make和GCC的角色

2.从阅读本post,我的理解是:

一个。这个“cmake and make”东西实际上使用g ++/gcc。 cmake和make stuff基本上就是使用g ++/gcc的工具。那是对的吗?

b。 gcc/g ++是做实际工作的编译器。

c。所以我可以直接使用gcc/g ++而不使用make和CMake的东西?

按照这个计算器answer:CMake的需要CMakeList.txt文件,并将其输出到一个特定于平台的构建格式,例如,一个Makefile,Visual Studio中,等

然而,当我碰到this OpenCV的安装:

mkdir release 
cd release 
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local .. 

它在一个目录里没有的CMakeLists.txt文件执行cmake的命令。你能解释一下吗?

4.,我已经看到通常的步骤是:cmakemakesudo make install。 我读这个计算器post,我是这么理解:

(I)make是建设项目。

(ii)make install是将二进制/可执行文件复制到已安装的目录。

a。那么当我们make,结果/二进制文件/可执行文件存储在哪里呢?

b。如果我们只运行make没有make install,是否意味着文件没有生成?

c。我碰到这个openCV tutorial关于使用openCV与GCC和CMake。它使用:

cd <DisplayImage_directory> 
cmake . 
make 

为什么它不这样做make install呢?

5.总结:

  • CMake的需要CMakeList。txt文件(这是跨平台)生成一个Makefile(这是特定于平台)。

  • 我可以手动编写Makefile并跳过CMake步骤。但是使用CMake步骤更好,因为它是跨平台的,否则如果我改变平台,我必须重新编写Makefile。

  • Make需要Makefile(由CMake生成或手动编写)作为编译和构建指南。在其工作中基本上使用gcc/g ++或其他编译器。让自己成为编译器的工具。

  • make install在把结果/可执行文件到安装路径

+0

可能的重复[CMake如何使用?](http://stackoverflow.com/questions/26007566/how-is-cmake-used) – wasthishelpful

回答

4

CMake的生成文件等构建系统。这些可以是Makefiles,Ninja文件或Visual Studio或Eclipse等IDE的项目文件。构建文件包含对GCC,Clang或cl.exe等编译器的调用。如果你安装了几个编译器,你可以选择一个。
这三个部分都是独立的。编译器,构建系统和CMake。

当你有历史时,它更容易理解。人们用他们的编译器。随着时间的推移添加了如此多的标志,每次输入它们都很麻烦。所以把这些调用放在一个脚本中。由此构建系统(Make,Ninja)发展而来。
人们想要支持多种平台,编译器,场景等,构建系统文件变得难以维护,并且它们的使用很容易出错。这就是人们发明为构建系统创建文件的元构建系统的原因。例子是Autotools或CMake。

  1. CMake的不使用你的编译器,使没有实现,但它要求(用途)编译器。
  2. CMakeLists.txt文件应位于release的父目录中。 CMake调用的最后一个参数表示CMakeLists.txt文件所在的路径。
  3. 对,make在build目录下生成文件。在你的例子中是3. release是build目录。你可以找到所有生成的文件并使用它们。安装是可选的,特别是如果你想开发软件,你不会安装它。
  4. 试着写一个大型项目的Makefiles,你会看到它有多少工作。但是,是的,5中的一切都是正确的。
+0

感谢您的回答。我想再次澄清第3点。所以最后一个参数是CMakeLists.txt的位置,在这种情况下,最后一个参数是..,这就是为什么CMakeLists.txt在父目录中...如果我想指向我的当前目录,我使用一个点。 , 是吗? – mon

+3

@mon:是的,但是这将是一个不鼓励的内部构建。源代码构建更好,您可以删除整个文件夹并重新开始。而你的源码目录不会与生成的文件混杂在一起。 – usr1234567