Skip to content

Linux中常见的C语言编程技巧#

The C program under linux#

  1. 我们一般使用的C语言编译器是gcc,常见的格式是gcc -o hello hello.c-o的意思是指定生成文件的命名;未指定的话是产生的文件名是a.out)。Linux环境下我们是用./hello用来执行文件.

静态链接库(.a)、汇编语言源文件(.s)、预处理输出文件(.i)、 目标代码(.o)、 共享函数库(.so)

并且gcc在编译的时候默认使用动态链接库,编译链接时并不把库文件的代码加入到其中,而是在程序执行的时候带太加载链接库,这样可以节约系统开销。

选项 作用
-g 创建用于gdb的符号表和调试信息
-I/-lm 连接库文件/会自动选择共享库
-m 根据指定的cpu优化代码
-w 忽略警告
-O 大写的O,是指编译器自己对代码进行优化(但这个优化有些时候可能会改变原有代码的实际目的)
-Wall 允许发出gcc提供的所有有用的警告信息
-E 只进行预编译
-S 跳过汇编和链接的阶段,并保留产生的汇编代码(.s file)
-v 产生尽可能多的信息(常用)
-c 跳过链接步骤,编译成目标文件(.o) (可以用于多文件编译)
-I 在头文件中添加dir目录
-L 在库文件的搜索路径列表中添加dir目录
-static 链接静态库
- library 连接名为library的库文件

gcc 可以开 -march=native 来避免通用性,适用于本地。 2. 具体的写库的过程可以看《Linux程序设计》p118.

Makefile#

我们常说的Makefile就是GNU make.它能够帮助我们快速完成编译(使已经编译过且未改动的文件不再编译)。多数同学在c程序设计专题中已经有所了解了。这里有一个深入浅出的手册放在这里。我会把一些重要的内容记录在下面。

  1. 命令格式:

make [选项] [make工程文件]

选项 作用
-d 显示调试信息
-f 使用指定文件作为依赖关系文件
-n 不执行makefile的命令,只是显示输出这些命令
  1. 编写makefile

​ makefile文件中通常包含以下的信息:

​ (1) 需要由make工具创建的目标体(target),通常是目标文件或可执行文件。

​ (2)要创建目标所依赖的文件。

​ (3)创建每个目标体时需要的命令。

​ makefile的书写规则:

目标文件:依赖文件

(Tab)产生目标文件的命令

  1. 常用清除中间的文件: clean: rm -f *.o

  2. Makefile中为了使可维护性较高,我们通常会设置环境变量。一般是用大写。

  3. makefile中常见预定义变量(因为还没用到,所以先不写了,之后再补充)

  4. makefile中常见的自动变量

命令格式 含义
$* 不包含扩展名的目标文件名称
$+ 所有的依赖文件,以空格分开,以出现的先后为序,可能重复
$< 第一个依赖文件的名称
$? 所有时间戳比目标文件晚的依赖文件
$@ 目标文件的完整名称
$^ 所有不重复的依赖文件,以空格隔开
$% 如果目标是归档成员,则该变量表示目标的归档成员名称
SRC = ..\..\src\acllib.c
INCLUDE_DIR = ..\..\src
LIB = gdi32 ole32 oleaut32 uuid winmm msimg32

all : keyboard mouse_move 

keyboard :
    gcc $(SRC) $@.c -I$(INCLUDE_DIR) $(LIB:%=-l%) -DWINVER=0x0501 -o $@

mouse_move :
    gcc $(SRC) $@.c -I$(INCLUDE_DIR) $(LIB:%=-l%) -DWINVER=0x0501 -o $@
main: main.o a.o b.o
    gcc -o main.o a.o b.o
main.o: main.c a.h b.h
    gcc -c main.c
a.o: a.c a.h
    gcc -c a.c
b.o: b.c b.h
    gcc -c b.c

# simple version
main: main.o a.o b.o
    gcc  -o $@ $^
..c.o: 
    gcc -c $<
  1. 小结:makefile文件主要包含五部分内容:显示规则、饮食规则、变量定义、文件只是和注释。

GDB#

GDB的全称是(GNU Debugger),用于调试c、c++等文件。当然命令行上的东西对于初学者一定是不怎么好用的,我也认为对于刚入门的同学来说不必急着去学习这些工具(vscode中的调试有内嵌gdb)。当你真正有这些需求的时候你自然而然会自己去学习。


Last update: 2024年1月28日 13:01:36
Created: 2023年7月6日 16:31:22