Linux C/C++ 编程环境搭建


一、安装必备的编译工具链

1.1 编译器GCC:默认将.c文件视为C程序,.cpp文件需手动指定为C++(如gcc -xc++);默认链接C标准库(libc),编译C++程序需手动添加-lstdc++参数。‌

G++:自动将.c和.cpp文件均视为C++程序,并启用C++语法解释(如预定义__cplusplus宏);自动链接C++标准库(libstdc++),无需额外参数。‌

两者区别:

底层关系与功能覆盖:核心一致性‌:两者共享同一编译器核心,G++本质是GCC的C++专用包装。多语言支持‌:GCC支持C、Fortran、Ada等语言,而G++仅针对C++优化。‌常见误区澄清:‌编译阶段‌:两者均可编译C/C++代码,但G++在编译阶段会调用GCC。‌宏定义‌:__cplusplus宏由文件后缀和编译器共同决定,并非仅G++定义。‌使用建议:C++项目‌:优先使用G++,避免手动链接库的复杂性。‌C项目‌:使用GCC以获得更简洁的编译流程。‌扩展‌:G++对C++11/17/20标准支持更完善(如-std=c++17),而GCC需显式指定。

安装完成后验证:

代码语言:shell复制gcc --version

g++ --version

make --version1.2 链接器make:适合小型项目,手动维护规则,简单直接。

CMake:适合跨平台和大型项目,自动生成 Makefile 等构建文件,更灵活强大。

详见:make和Cmake区别

1.2.1 Makefile编写手动敲编译命令容易出错,Makefile 让一切变得自动化:

代码语言:shell复制# 定义编译器,这里选择 GCC

CC = gcc

# 定义编译选项:

# -Wall:打开所有警告

# -g:生成调试信息

CFLAGS = -Wall -g

# 定义目标规则 'all',默认目标是 main

all: main

# 定义如何生成 main 可执行文件

# 使用目标 main.o 和 func.o 链接生成 main

main: main.o func.o

$(CC) $(CFLAGS) -o main main.o func.o

# 定义生成 .o 文件的通用规则

# 这里 $< 表示匹配的 .c 文件

%.o: %.c

$(CC) $(CFLAGS) -c $<

# 定义清理规则,删除所有中间文件和最终生成的目标文件

clean:

rm -rf *.o main执行命令:

代码语言:shell复制make # 自动编译,生成目标文件 main

make clean # 清理编译生成的中间文件和可执行文件1.2.2 使用 CMake写 Makefile 太麻烦?那就用 CMake!步骤如下:

安装代码语言:shell复制sudo pacman -S cmake项目根目录创建 CMakeLists.txt 文件代码语言:shell复制# 指定最低版本要求,这里是 3.10

cmake_minimum_required(VERSION 3.10)

# 定义项目名称,这里是 MyProject

project(MyProject)

# 添加可执行文件 main,并指定需要的源文件

# main.cpp 和 func.cpp 是需要编译的 C++ 源文件

add_executable(main main.cpp func.cpp)执行命令代码语言:shell复制# 创建一个名为 build 的目录,存放生成的构建文件

mkdir build && cd build

# 使用 CMake 生成 Makefile,.. 表示查找上级目录中的 CMakeLists.txt

cmake ..

# 使用 make 根据生成的 Makefile 编译项目

make1.3 调试工具安装代码语言:shell复制sudo pacman -S gdb调试代码语言:shell复制g++ -g hello.cpp -o hello # 编译的时候必须要加上 -g 参数,不然调试不了。

gdb ./hellogdb使用

run:运行程序。

break main:在 main() 函数处打断点。

next:单步执行。

print <变量名>:打印变量值。注:合理使用日志打印也是一种不错的调试方法,有些时候比调试器更管用。

1.4 排查内存问题:Valgrind安装代码语言:shell复制sudo pacman -S valgrind使用代码语言:shell复制valgrind ./your_program结果分析

正常情况: 如果看到 All heap blocks were freed,恭喜,没有内存泄漏!

有问题: 如果显示 definitely lost 或 indirectly lost,说明有内存没有正确释放,需要检查代码,比如 malloc 和 free 是否匹配。

一句话总结: 装个 Valgrind,跑一遍程序,就能快速找到内存泄漏问题。简单高效,C/C++ 开发必备!二、终端推荐:zsh + oh-my-zsh + vim

三、版本管理推荐:Git

黄金玫瑰多少一朵(一支24k金玫瑰花大概多少钱?)
怎么在交管12123绑定驾驶证