【问题标题】:Understanding roles of CMake, make and GCC了解 CMake、make 和 GCC 的角色
【发布时间】:2017-02-07 06:50:20
【问题描述】:

1. cmake 是来自 CMake 软件的命令:准备构建自动化系统; make 和 make install 是来自 Make 软件的命令:构建自动化系统。

2.通过阅读此post,我的理解是:

a. 这个“cmake and make”的东西实际上在其实现中使用了 g++ / gcc。 cmake 和 make stuff 基本上只是使用 g++ / gcc 的工具。对吗?

b. gcc / g++ 是执行实际工作的编译器。

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

3. 根据这个 stackoverflow 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。 我读了这个stackoverflow post,我的理解是:

(i) make 用于构建项目。

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

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

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

c. 我在将 openCV 与 GCC 和 CMake 结合使用时遇到了这个 openCV tutorial。它使用:

cd <DisplayImage_directory>
cmake .
make

为什么make install 也不行?

5.总结:

  • CMake 采用 CMakeList.txt 文件(跨平台)生成 Makefile(特定于平台)。

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

  • Make 将 Makefile(由 CMake 生成或手动编写)作为编译和构建的指南。 Make 在其工作中基本上使用 gcc / g++ 或其他编译器。 Make本身只是编译器的一个工具。

  • Make install 将结果/可执行文件放入安装路径

【问题讨论】:

标签: gcc makefile cmake


【解决方案1】:

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

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

  1. 是的
  2. CMake 不使用您的编译器,make 不实现它,但它调用(使用)编译器。
  3. CMakeLists.txt 文件应该在release 的父目录中。 CMake 调用的最后一个参数表示 CMakeLists.txt 文件所在的路径。
  4. 对,make在build目录下生成文件。在您的示例中,来自 3. release 是构建目录。您可以找到所有生成的文件并使用它们。安装是可选的,尤其是如果您想开发软件,您无需安装它。
  5. 尝试为大型项目编写 Makefile,您将看到它的工作量。但是,是的,5 中的一切都是正确的。

【讨论】:

  • 感谢您的回答。我想再次澄清第 3 点。所以最后一个参数是 CMakeLists.txt 的位置,在这种情况下最后一个参数是..,这就是为什么 CMakeLists.txt 在父目录中......如果我想指向我的当前目录,我使用一个点。 ,是吗?
  • @mon:是的,但这是不鼓励的源内构建。外源构建更好,您可以删除完整的文件夹并重新开始。而且您的源目录不会被生成的文件弄得杂乱无章。
  • 谢谢。有没有一本好书可以让人们阅读更多关于这方面的内容?
猜你喜欢
  • 2021-11-11
  • 1970-01-01
  • 2011-09-14
  • 2011-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多