gcc的编译与gdb调试

.c 文件用 gcc
.cc 文件用g++
gcc -E main.c -o main.i 预编译 宏替换
gcc -S main.i -o main.s 编译 汇编语言
as mian.s -o main.o 汇编 单个的二进制目标文件 可以在命令行输入 nm main.o
gcc -o main main.o 链接 多个二进制目标文件,连接成一个可执行文件

法一
gcc -E main.c -o main.i
gcc -S main.i -o main.s
gcc -o main main.s
法二
gcc -c main.c -o main.o
gcc -o main main.o
法三
gcc -o main mian.c

静态库的使用

#include <stdio.h>
#include "add.c"
#define N 2 
int main()
{
    int i= 0 ; 
    for ( ; i< 10 ; i++ )
    {

        printf("I am the %d \n",i*N);
    }
    printf( "2 + 3 = %d \n", add(2 ,3) );
    printf("Hello world\n");
    return 0;
}
add.c 文件
#include <stdio.h>
int  add (int a , int b )
{
    return a + b ; 
}

不使用库时,需要 #incude “add.c” 或者 在main函数文件中 声明函数 int add( int ,int)
同时编译两个文件 gcc -o main mian.c add.c
使用静态或者动态库时 只需要在main函数文件中 声明函数 int add( int ,int)

int main()
{
    int i= 0 ; 
    for ( ; i< 10 ; i++ )
    {

        printf("I am the %d \n",i*N);
    }
    printf( "2 + 3 = %d \n", add(2 ,3) );
    printf("Hello world\n");
    return 0;
}

编译时 要将add 变为静态库或者动态库
静态库: gcc -c add.c 或者 gcc -c add.c -o add.o 生成add.o文件
ar crsv libadd.a add.o
sudo cp libadd.a /lib (/lib/usr)
gcc -o main main.o -ladd (代表libadd)
静态库如果有变化则需要重新的编译
动态库 代码写法一致,编译时不同
-fpic 相对位置无关的代码
gcc -fpic -Wall -c add.c
gcc -shared -o libadd.so add.o
复制 sudo cp libadd.so /lib
gcc -o main main.c -ladd
makefile
target:dependency 目标文件:依赖文件 如果目标文件的更新时间比依赖文件的早,则执行更新
注意 command 必须要以 tab 开头
main : main.o add.o
gcc -o main main.o
main.o :main.c
gcc -o main.c
add.o : add.c
gcc -o add.c
.PHONY rebuild clean
rebuild: clean main
clean :
rm -rf *.o main
gdb 程序调试
gcc -o main main.c -g
gdb main
小写L 显示代码
b n 在n 行加入断点 d n 删除第n 个断点
n 不进入函数下一步
s 进入函数
r 运行
c 运行到结尾
q 退出
info 变量名 查看变量信息 (所在的进程,数值大小)
x & 变量名 查看变量的地址
bt 段错误 stack 栈上的数据
gdb ./main core 定位段错误
ps : linux的输入与输出的缓冲区
输入缓冲区清楚 getchar();
输出缓冲区 fflush(stdout);
linux 实现system(“pause”); 使用两个getchar();
please enter the key
getchar();
getchar();

常用makefile
OBJS:= main.o add.o
EXE:= main
( E X E ) : (EXE): (EXE):(OBJS)
gcc -o $(EXE) $(OBJS)
main.o :mian.c
gcc -c mian.c
add.o :add.c
gcc -c add.c
clean : rm &(EXE) $(OBJS)
$@ 当前命令目标文件
$^ 当前命令的目标文件

   OBJS := main.o add.c
   CC:= gcc
   main:$(OBJS)
   	$(CC) -o $@ $^
   main.o :main.c
   	$CC -o $@ -c  $^  (-o $@ 可以省略) 当前规则为 gcc -c main.c -o main.o
  add.o :add.c
  		$CC -o $@ -c $^ ( -o S@ 可以省略)当前规则为 gcc -c add.c -o add.o
  	clean:
  		rm $(EXE) $(OBJS)
  OBJS := main.o add.o
  CFLAGS:= -Wall-O2-g
  main:$(OBJS)
  	   gcc -o $@ $^
  %.o:%.c
  		gcc -o $@ $^
  编译多个目标文件
  SRCS = open1.c open2.c
  OBJS=$(SRCS:%.c=%.o)
  TAR = $(SRCS:%.c=%)
  all: $(TAR)
  		@for i in $(TAR) ; 
  		do gcc -o $$(i} $%{i}.c ; 
  		done 
  	.PHONY:clean
  	clean : 
  		rm ${TAR}
  	wildcard 搜索当前目录下的文件名,展开成一列所有符合其参数描述的文件名
  	SOURCES= $(wildcard  *.c) 所有.c 文件存入 sources
  	字符串替换函数$( patsubst 要查找的字串, 替换后的字串,源字串)
  	OBJS=$(patsubst %.cpp,%.o $(SOURCES)) 把 .cpp 替换成 .o
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值