linux编译器的下关于gcc、g++、make和CMake几个概念的区别

1-什么是gcc / g++???

首先说明:gcc 和 GCC 是两个不同的东西
GCC:GNU Compiler Collection(GUN编译器集合),它可以编译C、C++、JAV、Fortran、Pascal、Object-C、Ada等语言。
gcc是GCC中的GUN C Compiler(C 编译器),g++是GCC中的GUN C++ Compiler(C++编译器);

就本质而言,gcc和g++并不是编译器,也不是编译器的集合,它们只是一种驱动器,根据参数中要编译的文件的类型,调用对应的GUN编译器而已;
由于编译器是可以更换的,所以gcc不仅仅可以编译C文件
所以,更准确的说法是:gcc调用了C compiler,而g++调用了C++ compiler
gcc和g++的主要区别
1. 对于 *.c和*.cpp文件,gcc分别当做c和cpp文件编译(c和cpp的语法强度是不一样的)
2. 对于 *.c和*.cpp文件,g++则统一当做cpp文件编译
3. 使用g++编译文件时,g++会自动链接标准库STL,而gcc不会自动链接STL
4. gcc在编译C文件时,可使用的预定义宏是比较少的
5.gcc在编译cpp文件时/g++在编译c文件和cpp文件时(这时候gcc和g++调用的都是cpp文件的编译器),会加入一些额外的宏,这些宏如下:

#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern

6.在用gcc编译c++文件时,为了能够使用STL,需要加参数 –lstdc++ ,但这并不代表 gcc –lstdc++ 和 g++等价,它们的区别不仅仅是这个

主要参数
-g - turn on debugging (so GDB gives morefriendly output)
-Wall - turns on most warnings
-O or -O2 - turn on optimizations
-o - name of the output file
-c - output an object file (.o)
-I - specify an includedirectory
-L - specify a libdirectory
-l - link with librarylib.a

使用示例:g++ -o helloworld -I /homes/me/randomplace/include helloworld.C

      当你的程序只有一个源文件(如c语言的文件)时,直接就可以用gcc命令编译它。但是当你的程序包含很多个源文件时,用gcc命令逐个去编译时,你就很容易混乱而且工作量大,所以出现了make工具;

2.make

make工具可以看成是一个智能的批处理工具,它本身并没有编译和链接的功能,而是用类似于批处理的方式—通过调用makefile文件中用户指定的命令来进行编译和链接的。

makefile是什么?简单的说就像一首歌的乐谱,make工具就像指挥家,指挥家根据乐谱指挥整个乐团怎么样演奏,make工具就根据makefile中的命令进行编译和链接的。
          makefile命令中就包含了调用gcc(也可以是别的编译器)去编译某个源文件的命令。
          makefile在一些简单的工程完全可以人工手写(简单的书写-教程地址https://www.cnblogs.com/sld666666/archive/2010/04/08/1707789.html),但是当工程非常大的时候,手写makefile也是非常麻烦的,如果换了个平台makefile又要重新修改。这时候就出现了Cmake这个工具(不需要写makefile--语法严格相对复杂,需要写Cmakelist.txt--更简单的方式,通过Cmakelist自动生成makefile文件,附:Cmakelist的书写教程https://www.cnblogs.com/cv-pr/p/6206921.html);

3.CMake

CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多。CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要的makefile文件,最后用make命令编译源码生成可执行程序或共享库(so(shared object)).它的作用和qt的qmake是相似的。

cmake就可以更加简单的生成makefile文件给上面那个make用。当然cmake还有其他功能,就是可以跨平台生成对应平台能用的makefile,你不用再自己去修改了。
      可是cmake根据什么生成makefile呢?它又要根据一个叫CMakeLists.txt文件(学名:组态档)去生成makefile。
到最后CMakeLists.txt文件谁写啊?亲,是你自己手写的(见附加的教程)。

当然如果你用IDE,类似VS这些一般它都能帮你弄好了,你只需要按一下那个三角形-编译
cmake是make maker,生成各种可以直接控制编译过程的控制器的配置文件,比如makefile、各种IDE的配置文件。
make是一个简单的通过文件时间戳控制自动过程、处理依赖关系的软件,这个自动过程可以是编译一个项目。

4.linux下的其他常用编译工具

在linux系统下搞嵌入式开发,交叉编译器那肯定是必备工具。用的场合多了,就会见到各种各样的编译工具,比如:

arm-linux-gcc
arm-linux-gnueabi-gcc
arm-none-linux-eabi-gcc
arm-none-symbianelf-gcc
arm-none-uclinuxeabi-gcc
arm-none-linux-gnueabi-gcc
arm-cortex_a8-linux-gnueabi-gcc
mips-malta-linux-gnu-gcc

详细解析参考:https://blog.youkuaiyun.com/LEON1741/article/details/81537529

### 配置 g++ 编译器cmake 工具 #### 安装必要的软件包 为了在 Linux 上配置 `g++` 编译器以及 `cmake` 构建工具,需要先安装这些组件。可以通过系统的包管理器来完成这一操作。 对于基于 Debian 的发行版(如 Ubuntu),可以使用如下命令: ```bash sudo apt update && sudo apt install build-essential cmake ``` 这会更新本地的包列表并安装一系列用于编译 C/C++ 程序所需的工具链,其中包括 GNU Compiler Collection (GCC),它包含了 `g++` 编译器[^1]。 #### 创建简单的 CMake 项目结构 建立一个基本的文件夹结构有助于更好地管理构建项目。假设项目的根目录名为 `my_project`: ``` my_project/ ├── CMakeLists.txt └── src/ └── main.cpp ``` 其中 `main.cpp` 是源代码文件的位置,而 `CMakeLists.txt` 则是用来定义如何构建这个项目的脚本文件[^3]。 #### 编写 CMake 脚本 编辑位于项目根目录下的 `CMakeLists.txt` 文件,在里面指定最低版本需求、设置可执行目标等信息: ```cmake cmake_minimum_required(VERSION 3.10) project(MyProject VERSION 1.0 LANGUAGES CXX) add_executable(${PROJECT_NAME} src/main.cpp) ``` 这段脚本指定了使用的最小 CMake 版本为 3.10,并声明了一个名为 MyProject 的新工程,最后添加了一个由单个 `.cpp` 文件组成的可执行程序目标。 #### 使用 CMake 进行构建 进入项目所在的终端窗口,创建一个新的子目录用来放置生成的结果文件,通常命名为 `build` 或者 `_builds` : ```bash mkdir -p my_project/build && cd my_project/build ``` 接着运行下面这条指令让 CMake 处理顶层的 `CMakeLists.txt` 并生成相应的 Makefile 及其他辅助文件: ```bash cmake .. ``` 一旦成功完成了上述过程,则可通过调用 make 来实际编译整个工程项目: ```bash make ``` 如果一切顺利的话,现在应该可以在当前工作区找到刚刚被创建出来的二进制文件了。 #### 测试 OpenSSL 开发环境 当涉及到特定库的支持时,例如 OpenSSL 库,还需要额外确认其可用性正确链接方式。这里给出一段测试性的例子展示怎样编写能够利用到 OpenSSL 功能的应用程序片段[^2]: ```cpp #include <iostream> #include <openssl/evp.h> #include <openssl/rand.h> int main() { std::cout << "OpenSSL C++ Development Environment is set up!" << std::endl; return 0; } ``` 要使此代码正常运作,可能需进一步调整 CMake 设置以确保能正确查找连接至 OpenSSL 库资源。具体方法取决于所处的操作系统及其预设路径情况。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaoxilang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值