Linux_C笔记day03

###反汇编###
gcc -c mian.c -o main.o        //编译mian.c生成mian.o编译文件
objdump -d main.o    //反汇编mian.o文件
精简指令    复杂指令
异常(需重启)

###Makefile###
@@@
#CC=arm-linux-gcc    #若在arm板子上跑
FLAG=-c
OUTPUT=-o
CC=gcc
OBJ=test
ALL=main.o test.o hello.o

$(OBJ):$(ALL)
    $(CC) $^ $(OUTPUT) $(OBJ)
%.o:%.c
    $(CC) $(FLAG) $< $(OUTPUT) $@
.PHONY:clean
clean:
    rm -fr *.o $(OBJ)
.PHONY:distclean
distclean:
    rm -fr .config .old_config .config_bak
#    % 匹配所有字符    
#%.o:%.c     目标文件:依赖文件(条目)
#    .PHONY:clean    指定clean为一个伪目标,即当文件夹中含有一个clean文件时,执行make clean为执行Makefile文件中编写的make clean指令(清除编译),而不是执行系统自带的make clean(gcc clean.c -o clean)。
#    gcc -c $< -o $@        规则
#    $<    『规则』中的依赖文件
#    $@    『规则』中的目标文件
#    $^    『规则』中所有的依赖文件
#    # 注释
@@@
make    //根据Makefile生成可执行文件与.o文件
make clean    //清除生成的可执行文件与.o文件
mske distclean         //清除配置文件
redhat系统中自带make文件:make test = gcc test.c -o test

###动态库与静态库###
Linux:    /usr/lib
    静态库(.a)    动态库(.so)
Windows:    .dll(集成静态库与动态库的优点)
eg:libtest.so    库的名字:test
#库不需要加头文件,但需要编译生成目标文件
制作一个静态库
1.创建一个.c的函数功能文件,创建另一个main.c文件使用该文件,编译编写的功能库.c文件生成目标文件;
2.ar -cqs -o libtest.a test.o    #c:创建静态库 q:快速 s:加上索引 o:输出,后面加生成静态库名字要加前缀lib。
3.gcc main.c libtest.a -o test #一定要先写文件把k静态加到最后面。生成可执行文件test
4. ./test
静态库的优点:可执行文件在系统任意位置可运行,可执行文件包含静态库文件。
静态库的缺点:库文件巨大且生成可执行文件占用空间较大

制作一个动态库
1.创建一个.c的函数功能文件,创建另一个main.c文件使用该文件,编译编写的功能库.c文件生成目标文件;
2.gcc -FPIC -shared test.o -o libtest.so #生成动态库,FPIC:与地址无关 shared:生成动态库 o:输出
3.gcc main.c -L ./ -l test -o d_test        #-L:指定动态库的路径,。/当前路机 -l:指定动态库的名字 test,该步为链接动态库
4.export LD_LIBRARY_PATH=./    #用来指定一个变量的值的,变量名一定是LD_LIBRARY_PATH。
5. ./d_test    #执行该文件
动态库的优点:相较于静态库生成可执行文件较小。
动态库的缺点:一定要将动态库于可执行文件一起移植才可保证运行。

###函数指针###
函数名代表函数的入口地址。
回调函数:即函数名定义时,参数中包含着函数指针的函数。
函数指针:存放函数的入口地址。可代替函数进行函数调用,在回调函数中进行大量调用。
kill -l 查看系统所有信号值
函数指针的定义: 『函数的返回类型』 (*指针名)(函数的传值类型)        
    eg:int test(int a,int b);
       int (*pt)(int,int) =NULL;
       pt = test;
       pt(100,23);
在系统中以watchdog来产生关机的中断,用来检测死机和程序跑飞的情况。
tpyedef void (*sighandler_t)(int);  == tpyedef void (*)(int) sighandler_t;
一般把响应中断的函数写成回调函数。eg:signal();  //捕获信号,并对此信号做处理(1.系统默认的操作(SIG_DFL),2.自定义操作,3.忽略(SIG_IGN))。
alarm(3);    //三秒后发出闹钟信号SIGALRM,包含在unsitd.h头文件中
signal(14,test);    //用来监控信号14,自定义模式,包含在signal.h头文件中
pause();   //用来等待信号直到信号执行,包含在unistd.h头文件中
sleep(1);   //使cpu进入休眠状态1s,包含在unistd.h头文件中


你可能感兴趣的:(Linux_C笔记)