Linux 环境下C、C++、Go语言编译环境搭建秘籍
引言
在当今多元化的编程世界里,C、C++ 和 Go 语言凭借各自独特的优势,在不同的领域发光发热。C 语言作为一门古老而强大的编程语言,以其高效、贴近硬件的特性,在操作系统、嵌入式系统等底层开发中占据着重要地位;C++ 作为 C 的扩展,不仅继承了 C 的高效,还引入了面向对象编程的概念,广泛应用于游戏开发、大型软件系统等领域;而 Go 语言则是后起之秀,凭借其出色的并发性能、高效的编译速度和简洁的语法,在云计算、分布式系统等新兴领域迅速崛起。
Linux 系统以其开源、稳定、高效等特性,成为众多开发者的首选平台。在 Linux 系统中配置 C、C++ 和 Go 语言的编译环境,是进行相关开发工作的基础。它不仅能够让开发者充分利用 Linux 系统的优势,还能为开发工作提供一个稳定、高效的环境。接下来,本文将详细介绍在 Linux 系统中配置这三种编程语言编译环境的方法。
C 语言编译环境配置
安装 GCC 编译器
GCC(GNU Compiler Collection)是 Linux 系统下最常用的 C 语言编译器,它功能强大,支持多种编程语言,并且在大多数 Linux 发行版中都可以方便地进行安装。以 Debian 和 Ubuntu 系统为例,打开终端,输入以下命令更新系统的软件包列表:
sudo apt update
该命令会从软件源获取最新的软件包信息,确保后续安装的软件包是最新版本。更新完成后,使用以下命令安装 GCC 编译器:
sudo apt install gcc
在安装过程中,系统会提示你输入管理员密码,输入正确密码后,系统将自动下载并安装 GCC 编译器及其相关依赖项。安装完成后,可以通过以下命令验证 GCC 是否安装成功:
gcc --version
如果安装成功,终端会显示 GCC 的版本信息。对于 Red Hat 系列的系统,如 CentOS,安装命令有所不同,使用 yum 包管理器,先更新软件包列表:
sudo yum update
然后安装 GCC 编译器:
sudo yum install gcc
同样,安装完成后通过gcc --version命令验证安装结果。
编写并编译 C 语言程序
安装好 GCC 编译器后,就可以编写 C 语言程序了。首先,打开你喜欢的文本编辑器,比如 Vim、Nano 等。以 Nano 编辑器为例,在终端输入以下命令创建一个名为hello.c的文件:
nano hello.c
在文件中输入以下简单的 C 语言代码:
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
这段代码的功能是在控制台输出 “Hello, World!”。输入完成后,按下Ctrl + X,再按下Y,最后按下Enter键保存并退出 Nano 编辑器。接下来,使用 GCC 编译这个 C 语言程序,在终端输入以下命令:
gcc -o hello hello.c
这里的-o选项用于指定输出的可执行文件的名称,上述命令将hello.c编译成名为hello的可执行文件。如果编译过程中没有报错,就说明编译成功了。此时,在当前目录下会生成一个名为hello的文件,这就是编译后的可执行文件。运行这个可执行文件,在终端输入:
./hello
你将在终端看到输出结果 “Hello, World!”,这表明你的 C 语言程序已经成功运行。
常见问题及解决方法
在配置 C 语言编译环境的过程中,可能会遇到一些问题,以下是一些常见问题及解决方法:
- 安装失败:如果在安装 GCC 编译器时出现错误,可能是由于网络问题或者软件源配置错误。首先检查网络连接是否正常,可以尝试 ping 一个网站,如ping www.baidu.com。如果网络正常,检查软件源配置,确保软件源地址正确且可用。对于 Ubuntu 系统,可以编辑/etc/apt/sources.list文件,更换为国内的镜像源,如阿里云、清华大学的镜像源,然后重新执行安装命令。
- 编译错误:如果在编译 C 语言程序时出现错误,如语法错误,编译器会给出详细的错误提示。仔细查看错误提示信息,找到错误所在的行号和错误原因,修改代码后重新编译。例如,如果将printf函数写成了print,编译器会提示 “undefined reference to 'print'”,这时需要将print改为printf。
- 找不到头文件:当编译时提示找不到某个头文件,如#include <stdio.h>找不到,可以检查头文件路径是否正确。通常,系统头文件位于/usr/include目录下,如果是自定义的头文件,需要确保头文件所在路径在编译命令中正确指定。可以使用-I选项指定头文件路径,例如gcc -I/path/to/include -o hello hello.c,其中/path/to/include是头文件所在的目录。
C++ 编译环境配置
安装 g++ 编译器
g++ 是 Linux 系统下常用的 C++ 编译器,它是 GCC 编译器集合的一部分,支持多种硬件平台和操作系统,并且拥有活跃的社区进行改进和更新。以 Debian 和 Ubuntu 系统为例,在终端中输入以下命令来安装 g++ 编译器:
sudo apt update
sudo apt install g++
首先执行sudo apt update命令更新系统软件包列表,确保获取到最新的软件包信息。然后执行sudo apt install g++命令安装 g++ 编译器及其相关依赖项。对于 Fedora 系统,使用 dnf 包管理器,安装命令如下:
sudo dnf groupinstall "Development Tools"
该命令会安装一组开发工具,其中包括 g++ 编译器。安装完成后,可以通过以下命令查看 g++ 的版本,验证是否安装成功:
g++ --version
如果安装成功,终端会显示 g++ 的版本信息。
使用 g++ 编译运行 C++ 程序
安装好 g++ 编译器后,就可以编写和编译 C++ 程序了。首先,使用文本编辑器创建一个 C++ 源文件,例如使用 Vim 编辑器,在终端输入:
vim hello.cpp
在hello.cpp文件中输入以下简单的 C++ 代码:
#include <iostream>
int main() {
std::cout << "Hello, World!" << std::endl;
return 0;
}
这段代码使用 C++ 的标准库iostream,在控制台输出 “Hello, World!”。输入完成后,按下Esc键,输入:wq并回车,保存并退出 Vim 编辑器。接下来,使用 g++ 编译这个 C++ 源文件,在终端输入以下命令:
g++ hello.cpp -o hello
这里的-o选项用于指定输出的可执行文件的名称,上述命令将hello.cpp编译成名为hello的可执行文件。如果编译过程中没有报错,说明编译成功。此时,在当前目录下会生成一个名为hello的文件,这就是编译后的可执行文件。运行这个可执行文件,在终端输入:
./hello
你将在终端看到输出结果 “Hello, World!”,这表明你的 C++ 程序已经成功运行。
使用 cmake 管理 C++ 工程
在大型 C++ 项目中,文件数量众多,依赖关系复杂,使用传统的 Makefile 管理项目会变得非常繁琐。CMake 是一个跨平台的安装(编译)工具,它可以用简单的语句来描述所有平台的安装或编译过程。CMake 并不直接构建出最终的软件,而是产生标准的构建文件,如 Unix 的 Makefile 或 Windows 的 projects/workspaces,然后再依一般的建构方式使用 。在输出 makefile 或者 project 文件的同时,CMake 还能测试编译器所支持的 C++ 特性。
安装 CMake 非常简单,在大多数 Linux 发行版中,可以使用包管理器来安装。以 Ubuntu 系统为例,在终端输入以下命令:
sudo apt-get update
sudo apt-get install cmake
安装完成后,可以使用以下命令验证 CMake 是否成功安装:
cmake --version
如果成功安装,会显示 CMake 的版本信息。
使用 CMake 管理项目,需要在项目目录下创建一个名为CMakeLists.txt的文件,这个文件包含了项目的基本信息、源文件列表、依赖库等内容。以下是一个简单的CMakeLists.txt文件示例:
cmake_minimum_required(VERSION 3.0)
project(MyProject)
add_executable(MyProject main.cpp)
第一行指定了 CMake 的最小版本要求,第二行定义了项目名称为MyProject,第三行表示将main.cpp编译成一个名为MyProject的可执行文件。假设项目目录结构如下:
MyProject/
├── CMakeLists.txt
└── main.cpp
在项目目录下创建一个build目录,然后进入build目录,执行以下命令:
cmake ..
make
cmake ..命令会根据CMakeLists.txt文件生成与当前系统和编译器相关的构建文件,比如 Makefile。make命令则会执行 Makefile 文件,编译项目,生成可执行文件。编译成功后,在build目录中会生成可执行文件MyProject ,运行这个可执行文件,就能看到程序的输出结果。通过这种方式,使用 CMake 可以方便地管理大型 C++ 项目,提高开发效率。
Go 语言编译环境配置
下载 Go 编译器安装包
Go 语言官方网站提供了各个平台的编译器安装包,你可以通过以下步骤下载:打开浏览器,访问 Go 语言官方下载页面:https://golang.org/dl/ 。在下载页面中,根据你的 Linux 系统架构选择对应的安装包,常见的架构有 amd64、arm64 等。例如,如果你的系统是 64 位的 x86 架构,通常选择go1.x.x.linux-amd64.tar.gz格式的文件,其中1.x.x代表 Go 语言的版本号,建议下载最新稳定版本以获取最新的功能和性能优化。下载时,可以使用wget命令,比如下载 Go 1.20.5 版本:
wget https://golang.google.cn/dl/go1.20.5.linux-amd64.tar.gz
wget命令会从指定的链接下载文件并保存到当前目录。
解压与环境变量配置
下载完成后,需要解压安装包。使用tar命令进行解压,将 Go 安装到/usr/local目录下(这是一个常见的安装位置),命令如下:
sudo tar -C /usr/local -xzf go1.20.5.linux-amd64.tar.gz
这里的-C选项指定解压的目标目录,-xzf选项表示解压.tar.gz格式的压缩包。解压完成后,需要配置环境变量,以便在系统的任何位置都能使用go命令。编辑~/.bashrc或~/.profile文件(如果你使用的是其他 Shell,如zsh,则编辑对应的配置文件~/.zshrc),在文件末尾添加以下内容:
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
其中,GOROOT变量指定 Go 的安装目录,GOPATH变量指定 Go 项目的工作目录,PATH变量则将 Go 的可执行文件路径添加到系统的执行路径中。添加完成后,保存文件并关闭编辑器。然后在终端中执行以下命令,使环境变量设置立即生效:
source ~/.bashrc
如果是~/.profile文件,则执行source ~/.profile。
验证 Go 环境安装
配置完成后,可以通过查看 Go 的版本信息来验证安装是否成功。在终端中输入以下命令:
go version
如果安装成功,终端会显示 Go 的版本号,例如go version go1.20.5 linux/amd64,这表明你的 Go 语言编译环境已经安装并配置成功,现在你可以开始编写和运行 Go 语言程序了。
总结与展望
在 Linux 系统中配置 C、C++ 和 Go 语言的编译环境,虽然步骤各有不同,但都遵循一定的逻辑。通过安装相应的编译器和配置环境变量,我们能够顺利搭建起开发这三种语言程序的基础环境。在配置过程中,可能会遇到一些问题,如安装失败、编译错误等,但只要我们仔细分析错误信息,借助网络资源和社区的力量,总能找到解决办法。
配置好编译环境只是编程之旅的起点,后续还有更多精彩等待着我们。对于 C 语言,我们可以深入学习其指针、内存管理等核心特性,开发出更高效、更贴近硬件的程序;C++ 的面向对象编程和模板元编程等高级特性也值得我们去探索,以构建出更复杂、更健壮的软件系统;而 Go 语言的并发编程模型则为我们打开了一扇通往云计算、分布式系统开发的大门,我们可以利用它开发出高性能、高并发的应用程序。希望大家在掌握了编译环境配置的基础上,不断深入学习这三种编程语言,将它们应用到实际的项目开发中,创造出更多有价值的成果。
相关文章:
Linux 环境下C、C++、Go语言编译环境搭建秘籍
引言 在当今多元化的编程世界里,C、C 和 Go 语言凭借各自独特的优势,在不同的领域发光发热。C 语言作为一门古老而强大的编程语言,以其高效、贴近硬件的特性,在操作系统、嵌入式系统等底层开发中占据着重要地位;C 作为…...

MMR-Mamba:基于 Mamba 和空间频率信息融合的多模态 MRI 重建|文献速递-深度学习医疗AI最新文献
Title 题目 MMR-Mamba: Multi-modal MRI reconstruction with Mamba and spatial-frequency information fusion MMR-Mamba:基于 Mamba 和空间频率信息融合的多模态 MRI 重建 01 文献速递介绍 磁共振成像(MRI)因其无创、无辐射特性以及…...

2.5/Q2,Charls最新文章解读
文章题目:Trajectories of depressive symptoms and risk of chronic liver disease: evidence from CHARLS DOI:10.1186/s12876-025-03943-7 中文标题:抑郁症状的轨迹和慢性肝病风险:来自 CHARLS 的证据 发表杂志:BM…...

Unity QFramework 简介
目录 什么是MVC模式? QFramework 架构提供了 Model 的概念 QFramework 架构引入 Command 的方式 QFramework 架构引入 Event事件机制 四个层:表现层、系统层、数据层、工具层 委托和回调函数的关系 命令和事件的区别 工具篇 QFramework整体基于M…...

C++ 日志系统实战第五步:日志器的设计
全是通俗易懂的讲解,如果你本节之前的知识都掌握清楚,那就速速来看我的项目笔记吧~ 本文项目代码编写收尾! 日志器类 (Logger) 设计(建造者模式) 日志器主要用于和前端交互。当我们需要使用日志系统打印 log 时&…...
@Docker Compose部署Alertmanager
文章目录 Docker Compose部署Alertmanager1. 准备工作1.1 系统要求1.2 目录结构准备 2. 配置文件准备2.1 创建docker-compose.yml文件2.2 创建Alertmanager配置文件 3. 部署Alertmanager3.1 启动服务3.2 验证服务状态3.3 检查日志 4. 服务验证4.1 访问Web UI 4.2 API健康检查5.…...
前端面试准备-3
1.let、const、var的区别 ①:let和const为块级作用域,var为全局作用域 ②:let和var可以重新赋值定义,而const不可以 ③:var会提升到作用域顶部,但不会初始化;let和const也会提升到作用不顶部…...

性能测试-jmeter实战1
课程:B站大学 记录软件测试-性能测试学习历程、掌握前端性能测试、后端性能测试、服务端性能测试的你才是一个专业的软件测试工程师 性能测试-jmeter实战1 为什么需要性能测试呢?性能测试的作用?性能测试体系性能测试基础性能测试工具性能监控…...
汽车高速通信的EMC挑战
随着“软件定义汽车”的理念全面渗透,中国汽车行业正加速向集中式电子电气架构(E/E架构)转型。SOA(面向服务的架构)理念推动下,整车开始围绕中央计算平台(OIB)与分布式域控制器(VIU)构建,硬件平台具备前所未有的数据处理能力,能掌控整车控制与实时感知决策。 一、…...
[SC]SystemC在CPU/GPU验证中的应用(五)
SystemC在CPU/GPU验证中的应用(五) 摘要:下面分享50个逐步升级SystemC编程能力的示例及建议的学习路线图。您可以一次一批地完成它们——从前五个基础的例子开始,然后转向channels, TLM, bus models, simple CPU/GPU kernels等等。在每个阶段掌握之后,再进行下一组…...
[蓝桥杯C++ 2024 国 B ] 立定跳远(二分)
题目描述 在运动会上,小明从数轴的原点开始向正方向立定跳远。项目设置了 n n n 个检查点 a 1 , a 2 , ⋯ , a n a_1, a_2, \cdots , a_n a1,a2,⋯,an 且 a i ≥ a i − 1 > 0 a_i \ge a_{i−1} > 0 ai≥ai−1>0。小明必须先后跳跃到每个检查…...
现代网络安全攻防技术与发展现状
1. 引言 随着数字化转型进程的加速,全球信息化程度不断深入,网络安全问题日益凸显。根据最新的统计数据,2022年全球范围内的网络攻击事件较前一年增长了约41%,造成的经济损失高达超过6万亿美元。在这个背景下,了解现代…...

杏仁海棠花饼的学习日记第十四天CSS
一,前言 第二天,今天看CSS。 二,CSS简介及导入方式 CSS简介 CSS(层叠样式表,Cascading Style Sheets)是一种用于描述 HTML 或 XML(包括 SVG、XHTML 等)文档呈现效果的样式语言。…...

ESP8266远程控制:实现网络通信与设备控制
概述: 最近一直在弄esp8266的网络通信,但是一直都还没搞懂到底esp8266可不可以通过连接一个网络过后,在很远的地方使用网络将其关掉 在网上找了两个教程都有程序,都跑通了 第一个 第二个找不到了,但是程序有 CSDN上放文…...
RabbitMQ监控:关键技术、技巧与最佳实践
RabbitMQ作为企业级消息中间件的核心组件,其稳定性和性能直接影响分布式系统的可靠性。有效的监控不仅能帮助快速定位问题,还能优化系统资源分配,预防潜在故障。本文基于RabbitMQ官方文档,深入探讨其监控的技术方案、实践技巧及最…...

【机器学习基础】机器学习入门核心算法:隐马尔可夫模型 (HMM)
机器学习入门核心算法:隐马尔可夫模型 (HMM) 一、算法逻辑与核心思想二、算法原理与数学推导核心问题与算法推导 三、模型评估四、应用案例1. 语音识别 (Speech Recognition)2. 自然语言处理 (Natural Language Processing - NLP)3. 手写体识…...
zookeeper 操作总结
zookeeper 中的节点类型 节点类型命令选项说明持久节点无选项(默认)永久存在,除非手动删除。临时节点-e与客户端会话绑定,会话结束自动删除(不能有子节点)。顺序节点-s节点名自动追加递增…...
golang 实现基于redis的并行流量控制(计数锁)
在业务开发中,有时需要对某个操作在整个集群中限制并发度,例如限制大模型对话的并行数。基于redis zset实现计数锁,做个笔记。 关键词:并行流量控制、计数锁 package redisutilimport ("context""fmt""…...

Leetcode 2819. 购买巧克力后的最小相对损失
1.题目基本信息 1.1.题目描述 现给定一个整数数组 prices,表示巧克力的价格;以及一个二维整数数组 queries,其中 queries[i] [ki, mi]。 Alice 和 Bob 去买巧克力,Alice 提出了一种付款方式,而 Bob 同意了。 对于…...

AI炼丹日志-25 - OpenAI 开源的编码助手 Codex 上手指南
点一下关注吧!!!非常感谢!!持续更新!!! Java篇: MyBatis 更新完毕目前开始更新 Spring,一起深入浅出! 大数据篇 300: Hadoop&…...
AnyConv OGG 转换器:轻松转换音频格式
在数字音频世界中,不同的文件格式适用于不同的场景和设备。OGG 是一种开放、免费的音频格式,具有高压缩率和良好的音质。然而,有时我们需要将 OGG 文件转换为其他格式,或者将其他格式转换为 OGG。这就是 AnyConv OGG 转换器发挥作用的地方。 什么是 AnyConv OGG 转换器? …...

C# 类和继承(使用基类的引用)
使用基类的引用 派生类的实例由基类的实例和派生类新增的成员组成。派生类的引用指向整个类对象,包括 基类部分。 如果有一个派生类对象的引用,就可以获取该对象基类部分的引用(使用类型转换运算符把 该引用转换为基类类型)。类…...

进程间通信(消息队列)
目录 一 原理 二 API 1. ftok 2. msgget 3. msgctl 4. msgsnd 5. msgrcv 三 demo代码 四 基于责任链模式和消息队列对数据处理 1. 什么是责任链模式 2. 下面基于责任链模式来对消息队列获取的消息进行处理 前置 其实system v 版本的进程间通信,设计的接…...
Linux gron 命令使用详解
简介 gron 是一个独特的命令行工具,用于将 JSON 数据转换为离散的、易于 grep 处理的赋值语句格式。它的名字来源于 “grepable on” 或 “grepable JSON”,主要解决在命令行中处理复杂 JSON 数据的难题。 核心价值 gron 的核心是将 JSON 数据展平为类…...

Nginx--手写脚本压缩和切分日志(也适用于docker)
原文网址:Nginx--手写脚本压缩和切分日志(也适用于docker)_IT利刃出鞘的博客-CSDN博客 简介 本文介绍nginx如何手写脚本压缩和切分日志。 1.创建切分日志的脚本 创建脚本文件:/work/tmp/nginx-log_sh(后边要用run-…...

OpenCv高阶(十八)——dlib人脸检测与识别
文章目录 一、dlib库是什么?二、opencv库与dlib库的优缺点对比1、opencv优缺点2、dlib库优缺点 三、dlib库的安装1、在线安装2、本地安装 四、dlib库的人脸检测器1. 基于 HOG 的检测器2. 基于 CNN 的检测器 五、dlib人脸检测的简单使用1、导入必要库2、初始化人脸检…...

中山大学无人机具身导航新突破!FlightGPT:迈向通用性和可解释性的无人机视觉语言导航
作者:Hengxing Cai 1 , 2 ^{1,2} 1,2, Jinhan Dong 2 , 3 ^{2,3} 2,3, Jingjun Tan 1 ^{1} 1, Jingcheng Deng 4 ^{4} 4, Sihang Li 2 ^{2} 2, Zhifeng Gao 2 ^{2} 2, Haidong Wang 1 ^{1} 1, Zicheng Su 5 ^{5} 5, Agachai Sumalee 6 ^{6} 6, Renxin Zhong 1 ^{1} …...

WIN11+CUDA11.8+VS2019配置BundleFusion
参考: BundleFusion:VS2019 2017 ,CUDA11.5,win11,Realsense D435i离线数据包跑通,环境搭建 - 知乎 Win10VS2017CUDA10.1环境下配置BundleFusion - 知乎 BundleFusionWIN11VS2019 CUDA11.7环境配置-CSDN博客 我的环境:Win 11…...

WPF prism
Prism Prism.Dryloc 包 安装 Nuget 包 - Prism.DryIoc 1. 修改 App.xaml 修改 App.xaml 文件,添加 prism 命名空间, 继承由 Application → PrismApplication,删除默认启动 url, StartupUri“MainWindow.xaml” <dryioc:PrismApplicationx:Class…...
实时同步缓存,与阶段性同步缓存——补充理解《补充》
根据 Redis 缓存的数据与 DBMS 中数据的同步性划分,缓存一般可划分为两类:实时同步缓存,与阶段性同步缓存。 实时同步缓存是指,DBMS 中数据更新后,Redis 缓存中的存放的相关数据会被立即清 除,以促使再有对…...