在Linux环境下,包管理器是开发者最亲密的伙伴之一。不同于Windows需要到处下载安装包,Linux通过包管理器提供了统一的软件管理方案。主流的包管理器有:
提示:虽然源码安装看似灵活,但实际开发中99%的情况都应该优先使用包管理器。它能自动解决依赖关系,避免"依赖地狱"。
以常用的文件传输工具lrzsz为例:
bash复制# CentOS安装
sudo yum install -y lrzsz
# Ubuntu安装
sudo apt install -y lrzsz
这里的-y参数表示自动确认,适合脚本化安装。实际开发中建议首次安装时不加-y,先查看变更列表。
查看已安装软件:
bash复制# CentOS
yum list installed | grep lrzsz
# Ubuntu
apt list --installed | grep lrzsz
卸载软件时,remove只会删除软件包,而autoremove会同时清理不再需要的依赖:
bash复制# CentOS彻底卸载
sudo yum remove lrzsz
sudo yum autoremove
# Ubuntu彻底卸载
sudo apt remove lrzsz
sudo apt autoremove
软件源就像手机的应用商店服务器,不同源提供的软件版本和数量可能不同。企业开发环境中常需要配置私有源。
查看当前源配置:
bash复制# CentOS源配置
ls -l /etc/yum.repos.d/
# Ubuntu源配置
cat /etc/apt/sources.list
ls -l /etc/apt/sources.list.d/
更新软件源缓存(相当于刷新应用商店列表):
bash复制# CentOS
sudo yum makecache
# Ubuntu
sudo apt update
避坑指南:当出现"Could not resolve host"错误时,先检查网络连接,再尝试修改DNS配置为8.8.8.8或114.114.114.114
Vim之所以让新手望而生畏,主要源于其独特的多模式设计。但正是这种设计,让熟练使用者能达到其他编辑器无法比拟的效率。

插入模式快速定位:
i:当前光标处插入a:光标后插入(append)o:下方新建行插入O(大写):上方新建行插入s:删除当前字符并插入S:删除整行并插入命令模式高效移动:
w/b:按单词前/后跳转f{char}:跳转到当前行下一个char处;/,:重复/反向重复f查找Ctrl+o:跳回上一个位置Ctrl+i:跳回下一个位置开发者心得:在代码编辑时,
f+字符跳转比方向键高效10倍。比如f;可快速跳转到行内分号处
Vim的强大之处在于它用自然语言的方式操作文本对象:
vim复制daw " 删除一个单词(delete around word)
ciw " 修改当前单词(change inner word)
yap " 复制整个段落(yank around paragraph)
块编辑是Vim的杀手锏功能,特别适合批量修改代码:
Ctrl+v进入可视化块模式I进行块插入,输入内容后按Escd删除选中块示例:批量修改多行代码的变量名:
code复制var1 = 10 | var1 = 10
var1 = 20 | var1 = 20
var1 = 30 → | var1 = 30
操作:Ctrl+v选中第一列var1,c修改为var2
Vim有多个寄存器用于存储编辑内容:
"":默认寄存器"0:最近复制内容"a-"z:命名寄存器"+:系统剪贴板示例:复制内容到指定寄存器"ayw,粘贴时用"ap
在~/.vimrc中添加:
vim复制" 显示设置
set number " 显示行号
set cursorline " 高亮当前行
set tabstop=4 " Tab显示宽度
set shiftwidth=4 " 自动缩进宽度
set expandtab " 用空格代替Tab
" 搜索设置
set hlsearch " 高亮搜索结果
set ignorecase " 忽略大小写
set smartcase " 智能大小写
" 编码设置
set encoding=utf-8
set fileencodings=utf-8,gbk
Vundle(插件管理):
vim复制" 在.vimrc中添加
set nocompatible
filetype off
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
Plugin 'tpope/vim-fugitive' " Git集成
Plugin 'scrooloose/nerdtree' " 文件树
Plugin 'ycm-core/YouCompleteMe' " 代码补全
call vundle#end()
NERDTree文件浏览:
:NERDTreeToggle打开/关闭文件树
YouCompleteMe代码补全:
需要额外编译安装,支持C/C++/Python等语言的智能补全
执行命令:
bash复制gcc -E hello.c -o hello.i
预处理阶段会:
调试技巧:当宏定义出错时,查看.i文件可以确认宏展开结果
bash复制gcc -S hello.i -o hello.s
这个阶段将C代码转换为汇编代码,主要进行:
bash复制gcc -c hello.s -o hello.o
将汇编代码转换为机器码,生成可重定位目标文件(relocatable object file)。
bash复制gcc hello.o -o hello
链接器(ld)将多个.o文件和库文件合并,解决符号引用,生成可执行文件。
强制使用静态链接:
bash复制gcc -static hello.c -o hello_static
特点:
默认就是动态链接:
bash复制gcc hello.c -o hello_dynamic
特点:
查看依赖:
bash复制ldd hello_dynamic
输出示例:
code复制linux-vdso.so.1 (0x00007ffd45df0000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8e3a400000)
/lib64/ld-linux-x86-64.so.2 (0x00007f8e3a7f4000)
bash复制gcc -c module1.c -o module1.o
gcc -c module2.c -o module2.o
gcc module1.o module2.o main.c -o program
基本Makefile示例:
makefile复制CC = gcc
CFLAGS = -Wall -g
TARGET = program
OBJS = module1.o module2.o main.o
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) -o $@ $^
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -f $(OBJS) $(TARGET)
使用:
bash复制make # 编译
make clean # 清理
bash复制gcc -c add.c -o add.o
gcc -c sub.c -o sub.o
bash复制ar rcs libmath.a add.o sub.o
ar参数说明:
r:替换已存在文件c:创建库文件s:创建索引bash复制gcc main.c -L. -lmath -o calc
参数说明:
-L.:添加库搜索路径-lmath:链接libmath.abash复制gcc -fPIC -shared add.c sub.c -o libmath.so
参数说明:
-fPIC:生成位置无关代码-shared:生成共享库bash复制gcc main.c -L. -lmath -o calc
运行前需要让系统能找到库:
bash复制export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
./calc
查看默认搜索路径:
bash复制ld --verbose | grep SEARCH
永久添加库路径:
/etc/ld.so.conf或创建.conf文件在/etc/ld.so.conf.d/sudo ldconfig更新缓存头文件找不到:
bash复制fatal error: xxx.h: No such file or directory
解决:
bash复制gcc -I/path/to/headers ...
库文件找不到:
bash复制cannot find -lxxx
解决:
bash复制gcc -L/path/to/libs -lxxx
符号未定义:
bash复制undefined reference to 'function_name'
检查:
extern "C"编译时添加调试信息:
bash复制gcc -g program.c -o program
常用命令:
code复制break 行号/函数名 # 设置断点
run # 启动程序
next/n # 单步跳过
step/s # 单步进入
print/p 变量 # 打印变量值
backtrace/bt # 查看调用栈
continue/c # 继续执行
使用Valgrind检测内存泄漏:
bash复制valgrind --leak-check=full ./program
bash复制gcc -O0 # 无优化(默认)
gcc -O1 # 基本优化
gcc -O2 # 推荐优化级别
gcc -O3 # 激进优化
gcc -Os # 优化代码大小
使用gprof:
-pg选项bash复制gprof ./program gmon.out > analysis.txt
推荐配置~/.bashrc:
bash复制# 开发常用别名
alias gcc='gcc -Wall -Wextra'
alias make='make -j$(nproc)'
alias ll='ls -alFh'
alias grep='grep --color=auto'
# 快速跳转
export CDPATH=.:~:~/projects:/usr/local/src
# 历史命令增强
shopt -s histappend
export HISTFILESIZE=100000
export HISTSIZE=100000
export HISTTIMEFORMAT="%F %T "
使用tmux保持会话:
bash复制tmux new -s dev # 新建会话
Ctrl+b d # 分离会话
tmux attach -t dev # 重新连接
Git与Vim集成:
vim复制:Gstatus " 查看状态
:Gcommit " 提交更改
:Gblame " 查看修改历史
CMake基础示例:
cmake复制cmake_minimum_required(VERSION 3.10)
project(MyProject)
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
add_executable(myapp main.c module1.c module2.c)
target_link_libraries(myapp m) # 链接数学库
使用:
bash复制mkdir build && cd build
cmake ..
make
文件IO示例:
c复制#include <fcntl.h>
#include <unistd.h>
int main() {
int fd = open("test.txt", O_WRONLY | O_CREAT, 0644);
write(fd, "Hello System Call\n", 18);
close(fd);
return 0;
}
编译:
bash复制gcc -Wall syscall.c -o syscall
pthread示例:
c复制#include <pthread.h>
#include <stdio.h>
void* thread_func(void* arg) {
printf("Thread ID: %lu\n", pthread_self());
return NULL;
}
int main() {
pthread_t tid;
pthread_create(&tid, NULL, thread_func, NULL);
pthread_join(tid, NULL);
return 0;
}
编译:
bash复制gcc -pthread thread.c -o thread
常用命令:
bash复制top # 实时进程监控
htop # 增强版top
iotop # IO监控
nethogs # 网络流量监控
df -h # 磁盘空间
free -h # 内存使用
推荐使用rsync增量备份:
bash复制rsync -avz --delete ~/projects backup-server:/backups/
设置cron定时任务:
bash复制crontab -e
# 每天凌晨3点备份
0 3 * * * /usr/bin/rsync -avz --delete ~/projects backup-server:/backups/
条件编译示例:
c复制#include <stdio.h>
int main() {
#ifdef __linux__
printf("Running on Linux\n");
#elif _WIN32
printf("Running on Windows\n");
#elif __APPLE__
printf("Running on macOS\n");
#endif
return 0;
}
编译测试:
bash复制gcc -D__linux__ platform.c -o platform
Docker基础示例:
dockerfile复制FROM ubuntu:20.04
RUN apt update && apt install -y \
build-essential \
gdb \
git \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /workspace
构建和运行:
bash复制docker build -t dev-env .
docker run -it -v $(pwd):/workspace dev-env
在实际开发中,我习惯将常用命令做成alias放在~/.bashrc中,比如:
bash复制alias vimc='vim ~/.vimrc'
alias gccd='gcc -Wall -Wextra -g -O0'
alias valg='valgrind --leak-check=full --show-leak-kinds=all'
这样每天能节省大量重复输入时间。另外,建议每个项目都配套一个Makefile,即使最初很简单,随着项目复杂度的增加,好的构建系统能避免很多麻烦。