当前位置:首页 > 技术 > 正文内容

Linux环境下GCC/G++安装与Makefile自动化构建实践

访客 技术 2026年6月6日 1

GCC与G++编译器的部署与标准配置

在Linux系统中,部署C/C++编译环境通常通过包管理器完成。对于基于RPM的系统(如CentOS/RHEL),可以使用以下指令安装GCC和G++:

sudo yum install -y gcc
sudo yum install -y g++

安装完成后,可通过 gcc --versiong++ --version 验证当前环境版本。若系统默认版本较旧(例如4.8.5),在编译时可通过附加标准参数来启用新特性。例如,使用 -std=c99 启用C99标准,或使用 -std=c++11 启用C++11语法支持:

gcc -std=c99 main.c -o main
g++ -std=c++11 app.cpp -o app

Make工具与Makefile核心语法

Makefile 是定义项目构建规则的核心文件,它描述了文件之间的依赖关系以及相应的构建指令。

Makefile依赖关系示例

一个标准的Makefile规则由目标(Target)、依赖(Prerequisites)和配方(Recipe)组成:

  • 目标:冒号左侧的内容,通常是期望生成的可执行文件或目标文件。
  • 依赖:冒号右侧的内容,表示生成目标所需的源文件或头文件。
  • 配方:第二行及之后的缩进命令,描述了如何从依赖生成目标。

在配方中,常使用自动化变量来简化编写:

  • $@:代表当前规则的目标文件名。
  • $^:代表当前规则的所有依赖文件列表。

此外,Makefile 支持变量赋值,以提升脚本的可维护性。

对于不生成实际物理文件的规则(如清理编译产物),必须使用 .PHONY 声明为伪目标。这能有效防止因工作目录中存在同名文件而导致命令被跳过的问题。建议将所有非文件生成的目标均标记为 .PHONY

.PHONY: clean
clean:
	rm -f *.o $(TARGET)

make 命令则负责解析 Makefile,并根据文件的时间戳自动判断哪些目标需要重新编译,从而高效执行构建任务。

实战:基于Makefile构建动态进度条程序

以下通过一个模拟文件下载的动态进度条项目,演示如何组织代码并使用 Makefile 进行自动化编译。

1. Makefile 构建脚本

TARGET = download_simulator
SRCS = main.c progress_bar.c
CC = gcc
CFLAGS = -std=c99 -Wall -O2

$(TARGET): $(SRCS)
	$(CC) $(CFLAGS) -o $@ $^

.PHONY: clean run
clean:
	rm -f $(TARGET)

run: $(TARGET)
	./$(TARGET)

2. 进度条模块头文件 (progress_bar.h)

#ifndef PROGRESS_BAR_H
#define PROGRESS_BAR_H

void render_progress(double total_bytes, double downloaded_bytes);

#endif

3. 进度条渲染逻辑 (progress_bar.c)

#include <stdio.h>
#include <string.h>
#include "progress_bar.h"

#define BAR_WIDTH 50
#define FILL_CHAR '='
#define SPINNER_CHARS "|/-\\"

void render_progress(double total_bytes, double downloaded_bytes) {
    double ratio = downloaded_bytes / total_bytes;
    double percentage = ratio * 100.0;
    
    char bar[BAR_WIDTH + 1];
    memset(bar, ' ', sizeof(bar));
    bar[BAR_WIDTH] = '\0';

    int filled = (int)(ratio * BAR_WIDTH);
    for (int i = 0; i < filled; i++) {
        bar[i] = FILL_CHAR;
    }

    int spinner_index = ((int)percentage) % strlen(SPINNER_CHARS);
    char spinner = SPINNER_CHARS[spinner_index];

    printf("\r[%-50s] %5.1f%% %c", bar, percentage, spinner);
    fflush(stdout);
}

4. 主程序与模拟下载逻辑 (main.c)

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include "progress_bar.h"

#define TOTAL_FILE_SIZE 4096.0
#define BASE_CHUNK_SIZE 0.5

void simulate_network_download() {
    double current_downloaded = 0.0;
    
    while (current_downloaded < TOTAL_FILE_SIZE) {
        int random_factor = (rand() % 15) + 1;
        double chunk = random_factor * BASE_CHUNK_SIZE;
        current_downloaded += chunk;
        
        if (current_downloaded > TOTAL_FILE_SIZE) {
            current_downloaded = TOTAL_FILE_SIZE;
        }
        
        render_progress(TOTAL_FILE_SIZE, current_downloaded);
        usleep(30000); 
    }
    printf("\n");
}

int main() {
    srand((unsigned int)time(NULL));
    simulate_network_download();
    return 0;
}
标签: gccg++

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。