学习笔记,Linux虚拟机中C/C++的编译相关流程步骤

安装Linux虚拟机进行C/C++的编译相关流程

前言

在前面的文章中我们重点复习了C/C++的语法与相关用法,我们给出了一些运行Log,但是我们没有之前没关注编译事宜,都是交给编辑器帮我们编译的。

如果是一些开源项目我们想要为各种对应平台我们应如何操作?其实有很多办法,但是在 Windows/macOS 等非原生开发环境中,开发者常面临工具链配置复杂、编译效率受限、跨平台兼容性差等问题。所以这里我以 Linux 系统的编译为示例,也是大部分人的选择。

因为我的电脑是MacOS,本文将以 VMware 虚拟机 + Ubuntu 24.04 LTS 为实验环境,逐步演示如何搭建完整的 C/C++ 编译工具链。 Windows 系统的同学基本上都是一样的操作。

接下来我们会从软件安装,环境安装,然后通过一个简单示例来演示基本的编译流程。

一、安装 VMware 虚拟机

VMware 是一款广泛使用的虚拟化软件,能够在用户的计算机上创建和管理多个虚拟机,使得在不同操作系统之间的切换变得更加便捷,并且在 2024 年已经是免费使用了,我们无需搞什么破解版,直接在官网下载最新的安装包即可。

VMWare 的下载:

Fusion and Workstation | VMware

下载可能需要 Broadcom 的账号,我们可以使用邮箱注册博通账号,不需要额外的步骤账号密码搞完登录就能下载了。

在下载的页面我们可以看到很多版本的选择:

由于我的电脑是Mac 所以这里我选择使用 VMware Fusion,如果你是 Windows 电脑你可以选择 VMware Workstation

下载完成:

安装:

安装完成的经典界面:

接下来我们直接选择安装 Ubuntu 的 ios 方式安装。

二、安装 Ubuntu 系统

在成功安装 VMware 虚拟机后,接下来将进行 Linux 操作系统的安装。其实有界面和没界面的都可以,这里由于方便我们理解还是用有界面的 Ubuntu 系统来演示。

Ubuntu 是一个基于 Debian 的 Linux 发行版,以其易用性和强大的社区支持而受到开发者的广泛欢迎。本章节将详细介绍如何在 VMware 虚拟机中安装 Ubuntu 系统。

首先,您需要下载 Ubuntu 的 ISO 镜像文件。

下载Ubuntu桌面系统 | Ubuntu

下载完成之后选择ISO安装:

简单的下一步就能完成。到此这样就已经创建完成了,如果要修改配置也可以在设置中修改。

点击启动就能开启虚拟机了,第一次进去需要设置一下Ubuntu

语言 英语键盘 英语(美式),安装的分区方案,不想折腾我们直接选择"清除整个磁盘"。

ping 一下网络是通的。

为了方便我们可以把软件源设置为国内镜像,阿里云或者清华都可以。

less 复制代码
# 更新软件源(换国内镜像)
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

# 更新 sources.list
sudo bash -c "cat << EOF > /etc/apt/sources.list
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
EOF"

如果想要设置和宿主机互通还需要设置

perl 复制代码
# 更新软件包列表
sudo apt update

# 安装VMware Tools(实现宿主机互通)
sudo apt install open-vm-tools open-vm-tools-desktop

然后需要再 VMWare 中设置共享文件夹之类的。

到此我们就可以把主机的代码复制过去或者从云端 clone 代码进行编译了。

三、安装 C/C++ 编译环境与交叉编译环境

在成功安装 Ubuntu 系统后,接下来需要配置 C/C++ 编译环境。这将使您能够编写、编译和运行 C/C++ 程序。此外,我们还将介绍如何安装交叉编译工具,以便在 Ubuntu 上为其他平台(如 ARM)编译代码。

Ubuntu 提供了强大的工具链支持 C/C++ 开发,我们将使用 build-essential 包来安装所需的编译器和基本开发工具。

打开终端:

bash 复制代码
sudo apt update
sudo apt install build-essential   # 包含 GCC/G++/Make 等
sudo apt install gdb               # 调试工具

安装完成后,您可以通过以下命令验证 GCC 和 G++ 是否正确安装:

**安装交叉编译工具:**交叉编译工具允许您为不同平台(如 ARM、MIPS 等)编译代码。以下是安装 ARM 架构的交叉编译工具链的步骤。

如:ARM 嵌入式开发

复制代码
sudo apt install gcc-arm-linux-gnueabi
sudo apt install gcc-aarch64-linux-gnu

如 Windows 开发

bash 复制代码
sudo apt install -y mingw-w64

# 验证
x86_64-w64-mingw32-gcc --version

同时还可以安装 CMake 工具或者 NDK 等工具,这是后面用到的这里先不做演示了。

到此我们已经完成了基本的编译环境我们赶快来编译一个C/C++ 文件试试吧。

四、测试编译一个C/C++项目

如何把本机的C/C++文件复制到虚拟机中呢?我们可以通过之前的共享文件夹方式,也可以通过SSH的基础连接。

对于一些非页面的 Linux 系统来说,SSH 的方式更加的通用,所以这里再通过 SSH 命令的方式演示一遍。

首先我们先启用 Ubuntu SSH 服务

bash 复制代码
sudo apt install openssh-server
sudo systemctl enable ssh
sudo systemctl start ssh

查看当前虚拟机的IP,输入命令 ip a

我们打开主机(我的MAC)的终端输入上面的IP地址

css 复制代码
ssh [email protected]

连接成功之后,此时的环境就是 Linux 的环境了,此时我们输入的命令就是 Linux 的命令,可以测试:

那么如果我们想从Mac把文件传输到 Linux 虚拟机,我们还是需要在Mac环境操作,此时我们重新打开一个终端:

ruby 复制代码
scp /Users/liukai/Documents/test.txt [email protected]:~/Documents/

我们到虚拟机中查看是否传输完成呢?

OK,没有问题,那么我们接下来就把本机的一个C文件传递过来吧。

ruby 复制代码
scp -v /Users/newki/Desktop/CWorkSpace/sort.cpp [email protected]:~/Documents/

sort.cpp 源码:

ini 复制代码
#include <stdlib.h>
#include <stdio.h>

// 快速排序
void quickSort(int *arr, int l, int r)
{
    // 此处编写代码实现快速排序
    int i, j, x, temp;
    if (l < r)
    {
        i = l;
        j = r;
        x = arr[(l + r) / 2];
        // 以中间元素为轴
        while (1)
        {
            while (i <= r && arr[i] < x)
                i++;
            while (j >= 0 && arr[j] > x)
                j--;
            if (i >= j) // 相遇则跳出
                break;
            else
            {
                temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
                // 交换
            }
        }
        quickSort(arr, l, i - 1); // 对左半部分进行快排
        quickSort(arr, j + 1, r); // 对右半部分进行快排
    }
}

int main(void)
{
    // 数组的排序 - 冒泡排序
    int a[5] = {12, 19, 2, 993, -34};
    int len = sizeof(a) / sizeof(int);
    // 遍历排序之前的数组
    for (int i = 0; i < len; i++)
    {
        printf("before order: index:%d  value:%d\n", i, a[i]);
    }

    printf("-----------------------------------\n");

    // 遍历排序之后的数组
    for (int i = 0; i < len; i++)
    {
        printf("after order :index:%d  value:%d\n", i, a[i]);
    }
}

开始使用GCC编译并执行

编译的产物:

完全没有问题!

总结

在本章节中,我们详细介绍了如何在 VMware 虚拟机中安装 Ubuntu 系统,并配置 C/C++ 编译环境以及交叉编译环境。这些步骤为您在 Linux 平台上进行开发打下了基础,尤其是对于 C/C++ 项目的构建和调试。

我许多开发者在 Mac 电脑上直接进行编译,不想麻烦再搞一个虚拟机。其实在 Linux 系统上编译的过程也有其独特的优势。Linux 系统的命令行工具和包管理系统使得软件安装和环境配置更加高效。在大型项目开发中,我们通常依赖于服务器或云端的 Linux 系统进行编译和部署,因此熟悉 Linux 系统的操作和命令将极大地提高我们的工作效率。

在示例中,我们使用了简单的单文件编译来演示基本的编译流程。前文中提到的 CMake、Makefile 和交叉编译等概念都是 C/C++ 开发中的重要组成部分,后续的文章中我们将深入探讨这些工具的使用。在 Linux 虚拟机中实践这些工具,将使您对构建系统和项目管理有更加深刻的理解。

由于涉及到的知识点较多,我在这篇文章中尽量通过图文并茂的方式进行详细说明,以便于读者更好地理解。如果在阅读过程中遇到任何不清晰的地方,或者在代码、注释中发现错误和遗漏,请随时指出并进行修正。

如果您觉得本文对您有启发和帮助,请给我一个点赞以示支持!您的反馈是我不断改进的重要依据。

Ok,完结撒花啦。

相关推荐
yanjiee44 分钟前
Cursor无法使用C/C++调试的解决办法
c语言·开发语言·c++·vscode
爱吃涮毛肚的肥肥(暂时吃不了版)1 小时前
仿腾讯会议——添加音频
c++·算法·面试·职场和发展·音视频·腾讯会议
学习使我变快乐1 小时前
C++:单例模式
开发语言·c++·单例模式
梁辰兴1 小时前
数据结构实验10.1:内部排序的基本运算
数据结构·c++·算法·排序算法·c·内部排序
虾球xz1 小时前
游戏引擎学习第291天:跳跃的怪物与占据的树木
c++·学习·游戏引擎
共享家95272 小时前
布隆过滤器
c++
菜菜why2 小时前
esp32课设记录(五)整个项目开源github
c语言·esp32
mochensage2 小时前
2025年全国青少年信息素养大赛C++小学全年级初赛试题
开发语言·c++·算法
liulangrenaaa3 小时前
C语言实现android/linux按键模拟
android·linux·c语言
潇-xiao3 小时前
Qt 信号和槽-核心知识点小结(11)
c++·笔记·qt