Linux中常见的C语言编程技巧#
The C program under linux#
- 我们一般使用的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程序设计专题中已经有所了解了。这里有一个深入浅出的手册放在这里。我会把一些重要的内容记录在下面。
- 命令格式:
make [选项] [make工程文件]
选项 | 作用 |
---|---|
-d | 显示调试信息 |
-f | 使用指定文件作为依赖关系文件 |
-n | 不执行makefile的命令,只是显示输出这些命令 |
- 编写makefile
makefile文件中通常包含以下的信息:
(1) 需要由make工具创建的目标体(target),通常是目标文件或可执行文件。
(2)要创建目标所依赖的文件。
(3)创建每个目标体时需要的命令。
makefile的书写规则:
目标文件:依赖文件
(Tab)产生目标文件的命令
-
常用清除中间的文件: clean: rm -f *.o
-
Makefile中为了使可维护性较高,我们通常会设置环境变量。一般是用大写。
-
makefile中常见预定义变量(因为还没用到,所以先不写了,之后再补充)
-
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 $<
- 小结:makefile文件主要包含五部分内容:显示规则、饮食规则、变量定义、文件只是和注释。
GDB#
GDB的全称是(GNU Debugger),用于调试c、c++等文件。当然命令行上的东西对于初学者一定是不怎么好用的,我也认为对于刚入门的同学来说不必急着去学习这些工具(vscode中的调试有内嵌gdb)。当你真正有这些需求的时候你自然而然会自己去学习。
Last update:
2024年1月28日 13:01:36
Created: 2023年7月6日 16:31:22
Created: 2023年7月6日 16:31:22