Linux环境:C编程基础操作

12 篇文章 0 订阅

gcc安装

Ubuntu:

sudo apt-get install gcc

Centos:

sudo yum install gcc

确认是否安装成功

gcc -v

gcc基础编译命令

通过gcc编译命令可以生成后缀名.i的预处理文件,.s的汇编文件,.o的目标文件,.a/.so的库文件和可执行文件
Linux中的C程序源码编译成可执行程序,可能需要依赖多个库文件。可以把这些依赖的库文件当作源码文件的一部分。

常用gcc命令参数
-c 后接编译源文件名
-o 后接产生的目标文件
-g 表示在目标文件中产生调试信息,使得目标文件可以用于 gdb 调试
-D<宏定义> 编译时将宏定义参数传入进去
-Wall 打开所有类型的警告

生成可执行文件的方式

  1. 若干源码文件 直接编译生成可执行文件
    格式:gcc [源码文件名] -o [可执行文件名]
    eg.
    	gcc c1.c c2.c -o test.exe
    
  2. 源码文件生成目标文件,目标文件和依赖的库文件(可以省略)一起链接生成可执行文件
    格式:
    gcc -c [源码文件名] -o [目标文件名]
    gcc -o [可执行文件] [源码文件] -[库文件]
    	gcc -c c1.c -o c1.o
    	gcc -c c2.c -o c2.o
    	gcc -o test.exe c1.o c2.o
    
  3. 源码文件生成预处理文件,预处理文件生成汇编文件,汇编文件生成目标文件,目标文件链接成可执行文件
    	gcc -E  main.c -o main.i
     	gcc -S  main.i -o main.s
      	gcc -c  main.s -o main.o
    	gcc -o  main.exe main.o
    

gcc进阶命令:静态库与动态库文件的生成

  1. 静态库文件生成
    静态库生成较为简单,库文件在链接时直接注入源码文件,生成的可执行文件移植性好,运行时不依赖静态库文件,方便部署,但是不利于升级,每次升级后需要重新生成可执行文件
    生成流程:

    1. gcc编译命令生成目标文件 gcc -c add.c -o add.o
    2. ar命令对目标文件(可以是多个)打包生成库文件 crsv为参数,其中csv是修饰符可以省略 ar crsv libadd.a add.o
    3. 库文件放入默认库文件路径/lib/usr/lib mv libadd.a /lib
    4. 编译生成可执行文件,注意库文件名gcc -o main.exe main.c -ladd

其中,只有第二步需要记忆,其他均为常规操作。

  1. 动态库文件生成
    动态库生成稍微复杂,库文件在链接时不注入源码文件,生成的可执行文件运行时需要依赖动态库文件,移植性差,不便于部署在其他机器,但是升级方便,只需要更新库文件。
    生成流程:

  2. 动态编译生成目标文件 gcc -fPIC -Wall -c add.c

  3. 目标文件生成动态库文件 gcc -shared -o libadd.so add.o

  4. 库文件放入默认库文件路径/lib/usr/lib mv libadd.so /lib

  5. 编译生成可执行文件,注意库文件名gcc -o main.exe main.c -ladd
    需要注意的是第一步和第二步也可以合成一步gcc -fPIC -Wall -shared -o libadd.so add.c

批量编译:Makefile简介

通过编写Makefile文件可以实现批量编译操作

原理:每次编译过程使用的命令大体相同,不同的只有文件名,所以可以使用变量名替换掉文件名,从而实现自动化编译。不同的文件之间存在依赖关系,所以采用自顶(可执行文件)向下(源码文件)的递归过程。
Makefile的语法规则:

  1. 变量命名 :Makefile实际上是采用不同字符串对命令进行替换实现的,所以变量均为字符串格式。为了与命令区别,变量使用时需要加小括号并使用$进行标识$(变量名)

    • 直接赋值定义:变量名:= 字符串
    • 递归式定义 : 变量名 = 字符串(变量名)类似多个指针指向一个地址
  2. 函数:

    • 查找函数$(wildcard *.c),wildcard是函数名,后跟一个参数,作用是将符合该参数规则的文件名当作一列字符串输出,各个文件名之间会隔开。*.c会找到当前目录下的所有.c文件名并输出
    • 字符串替换函数$(patsubst 匹配规则1,匹配规则2,源字符串列表)将源字符串列表中符合匹配规则1的字符串 进行替换 使其符合匹配规则2。Makefile中的通配符为%

    示例OC=$(patsubst %.c,%.o,$(wildcard *.*))含义是将当前目录下所有有后缀名的文件中的.c文件名拿出来,并把.c替换成.o,然后将这一串字符串赋值给变量OC

  3. 规则
    主要用到 :

    • $@代表当前规则下的目标文件\
    • $^代表当前规则的所有依赖文件
    • 所有的.o文件会自动依赖同名的.c文件
    • 一系列的预定义变量
      通过上述规则,即可编写通用的makefile文件,针对特殊需求只需要修改对应变量即可

以下为简单的通用Makefile文件示例

生成可执行文件的Makefile文件
   EXE:=test.exe                                                                                                                                                                              
   #编译后得到的可执行文件的名字
   
   CC:=gcc
   #选择的C编译器 可以根据需要改动
   
   CFLAGS:=-Wall -g
   #gcc编译参数 显示所有警告信息 可调试 可以根据需要改动
   
  LIBSO:=
  #库依赖文件 可以根据需要添加
  
  OC := $(patsubst %.c, %.o, $(wildcard *.c))
  #目标文件列表 用来生成可执行文件
  
  $(EXE):$(OC)
      $(CC) $(CFLAGS) -o $@ $^
  
  .PHONY : clean rebuild
  clean:
      rm -f $(EXE) $(OC)
  rebuild:
      clean $(EXE)
生成静态库文件的Makefile文件
# 库文件名, lib*.a
TARGET  := libtest.a

# 编译器选择
CC      := gcc

#打包程序选择
AR      = ar

#gcc编译参数 显示所有警告信息 可调试 可以根据需要改动
CFLAGS:=-Wall -g

#依赖的库文件
LIBS    :=

# 自动查找当前目录所有 .c 文件,并将目标定义为同名 .o 文件

SOURCE  := $(wildcard *.c)

OBJS    := $(patsubst %.c,%.o,$(SOURCE))

 
$(TARGET) : $(OBJS) 

#生成静态库文件
    $(AR) crvs $(TARGET) $(OBJS)

#移动到/lib中
    mv $(TARGET) /lib

.PHONY : clean delete rebuild

clean :
#删除中间文件
    rm -rf *.o
#删除库文件
delete:
	rm  /lib/$(TARGET)
#重新生成库文件
rebuild:
	clean $(TARGET)


生成动态库文件的Makefile文件
# 库文件名, lib*.so
TARGET  := libtest.so

# 编译器选择
CC      := gcc

#gcc生成动态库文件的编译参数
CFLAGS:= -g -Wall -fPIC -shared -o

#依赖的库文件
LIBS    :=

# 自动查找当前目录所有 .c 文件

SOURCE  := $(wildcard *.c)

$(TARGET) : $(OBJS) 
	$(TARGET) $(CFLAGS) $(TARFET) $(SOURCE) 

#移动到/lib中
    mv $(TARGET) /lib

.PHONY : clean delete rebuild

clean :
#删除中间文件
    rm -rf *.o
#删除库文件
delete:
	rm  /lib/$(TARGET)
#重新生成库文件
rebuild:
	clean $(TARGET)

gcc调试命令gdb

如果在gcc编译程序时加入了-g参数,则可以使用gdb命令对可执行文件进行调试
gdb -q 可执行文件名
#-q参数可以消除gdb启动时输出的无用的版本信息等
常用gdb命令:
l:查看代码
b : 打断点
info b:查看所有断点
tb :打临时断点
r :运行
bt:查看函数堆栈调用信息
delete:删除断点
n:下一步,遇到函数直接执行不进入
s:下一步,遇到函数进入
disable:使某个断点失效
enble:启用某个断点
c:继续运行
p:打印命令,可以用来打印变量
q:退出

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
本文是Linux 下C 语言编程入门教程。主要介绍了Linux 的发展与特点、C语言的基础知识、Linux 程序设计基础知识及其下C 语言编程环境Linux 程序设计的特点及其下C 语言编程风格等。   Linux 作为一个优秀的操作系统,一项非常重要的功能就是支持系统调用尤其是支持C语言的系统调用功能十分的方便、快捷。C 语言具有高速、灵活、简洁、可移植性好等特点,从而很快成为了世界上最受欢迎的编程语言之一。   1 Linux 的发展和特点 Linux 最初是专门为基于Intel 处理器的个人计算机而设计的。Linux 的前身是赫尔辛基大学( University of Helsinki )一位名叫Linus Torvald 的计算机科学系学生的个人项目。Linus 把Linux 建立在一个基于PC 机上运行的、缩小型的、名为Minux 的UNIX 基础之上, Minux 本身具有UNIX 的各种特性, 这使得以Minux 做参照而产生的Linux 继承并更突出了UNIX 的各种优良特性。当时LinusTorvold 通过USENET (新闻组)宣布了Linux 是一个免费的系统,并指出它主要在x86 电脑上使用,希望大家一起来将它完善, 并将源代码放到了芬兰的FTP 站点上供人免费下载。本来他想把这个系统称为freax ,可是FTP 的工作人员认为这是Linus 的Minux ,就用Linux 这个子目录来存放,于是它就成了“ Linux ”。这时的Linux 只有核心程序(内核) ,还不能称作是完整的系统,不过由于许多专业用户(主要是程序员)自愿地开发它的应用程序,并借助Internet 拿出来让大家一起修改一起完善,所以它的周边的程序也越来越多,功能也越来越强大, Linux 本身也就这样逐渐发展壮大起来。近年来,Linux 操作系统得到了迅猛地发展,在短短的几年之内就包含了UNIX 的全部功能和特性,在中高端服务器上得到了广泛的应用,国际上很多有名的硬、软件厂商都与之结盟、捆绑,将之用作自己的操作系统。Linux 操作系统得到了非常迅猛地发展,这与Linux 具有的良好特性是分不开的。     Linux 操作系统的特点可总结为以下几点:   1. 自由软件   Linux 项目从一开始就与GNU 项目紧密结合起来, 它的许多重要组成部分直接来自GNU 项目。Linux 可以说是作为开放源码的自由软件的代表,便于定制和再开发。在遵从GPL 版权协议的条件下,各部门、企业、单位或个人就可以免费得到Linux 源程序,并根据自己的实际需要和使用环境Linux 系统进行裁剪、扩充、修改,再开发和发布程序的源码,并公布在Internet 上。这样就激发了世界范围内热衷于计算机事业的人们的创造力。通过Internet ,这一软件的传播和使用迅速扩大。因为Linux 操作系统可以从互联网上很方便地免费下载,这样就可以省下购买Windows 操作系统的一笔不小的资金(正版Windows 很昂贵) 。且由于可以得到Linux 的源码,所以操作系统的内部逻辑是可见的,这样就可以根据源码准确地查明故障产生的原因,及时采取相应对策。   2. 开放性   开放性是指系统遵循世界标准规范,特别是遵循开放系统互连( OSI )国际标准。凡遵循国际标准所开发的硬件和软件,都能彼此兼容,可方便地实现互连。   3. 多用户   系统资源可以被不同用户各自拥有使用,即每个用户对自己的资源(例如:文件、设备)有特定的权限,互不影响,允许多个用户从相同或不同的终端上同时使用同一台计算机。   4. 多任务   它是指计算机允许多个程序同时执行,而且各个程序的运行互相独立。Linux 系统调度每一个进程,平等地访问微处理器。由于CPU 的处理速度非常快,其结果是,启动的应用程序看起来好像在并行运行。事实上,从处理器执行一个应用程序中的一组指令到Linux 调度微处理器再次运行这个程序之间只有很短的时间延迟,用户是感觉不出来的。Linux 充分利用了X86CPU 的任务切换机制,实现了真正多任务、多用户环境,允许多个用户同时执行不同的程序,并且可以给紧急任务以较高的优先级。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值