Linux入门学习-gcc编译器与静态动态链接_第五章

本文介绍了Linux中GCC编译器的使用,重点讨论了静态链接库与动态链接库的区别。静态链接库在链接后,代码会被复制到可执行文件中,而动态链接库在内存中只有一份,被多个程序共享。通过实例展示了如何创建静态库、动态库以及如何链接。最后,给出了使用动态链接的例子。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GCC和G++的区别:

(1)gcc和g++都是GNU(组织)的一个编译器。

(2)后缀名为.c的程序和.cpp的程序g++都会当成是c++的源程序来处理。而gcc不然,gcc会把.c的程序处理成c程序。

(3)对于.cpp的程序,编译可以用gcc/g++,而链接可以用g++或者gcc -lstdc++。(个人觉得这条是最重要的)


5.1 静态链接库与动态链接库的区别

静态链接库在链接后,被引用的代码讲被复制到最终的可执行文件中,可脱离函数库直接运行。

动态链接库在内存中只包含一份可执行的映像,所有链接到动态链接库的程序都共享这份映像!


5.2 静态链接


bear@bear-K40IE:~/program/sec$ls

add.c add.o first1.c lib src

bear@bear-K40IE:~/program/sec$ar rv libtools.a add.o

ar:creating libtools.a

a– add.o

bear@bear-K40IE:~/program/sec$ls

add.c add.o first1.c lib libtools.a src

bear@bear-K40IE:~/program/sec$vi libtools.a

bear@bear-K40IE:~/program/sec$ls

add.c add.o first1.c lib libtools.a src

bear@bear-K40IE:~/program/sec$vi sub.c

bear@bear-K40IE:~/program/sec$ls

add.c add.o first1.c lib libtools.a src sub.c

bear@bear-K40IE:~/program/sec$gcc -c -O sub.c   //-O 优化编译选项

bear@bear-K40IE:~/program/sec$ls

add.c add.o first1.c lib libtools.a src sub.c sub.o

bear@bear-K40IE:~/program/sec$ar rv libtools.a sub.o //创建静态链接库,并将sub.o链接文件加入静态链接库中

a- sub.o

bear@bear-K40IE:~/program/sec$mv libtools.a ./lib


bear@bear-K40IE:~/program/sec/lib$vi my.h

bear@bear-K40IE:~/program/sec/lib$ls

libtools.a my.h

bear@bear-K40IE:~/program/sec$vi first1.c

bear@bear-K40IE:~/program/sec$gcc -c -I./ first1.c

bear@bear-K40IE:~/program/sec$ls

add.c add.o first1.c first1.o lib my.h src sub.c sub.o

bear@bear-K40IE:~/program/sec$gcc -c first1.c //编译first1.c文件生成first1.o的链接文件

ear@bear-K40IE:~/program/sec$gcc first1.o -L./lib -ltools -o first1 //链接firsr1.o文件至静态链接库libtools

bear@bear-K40IE:~/program/sec$ls

add.c add.o first1 first1.c first1.o lib my.h src sub.c sub.o

bear@bear-K40IE:~/program/sec$./first1

VALUE+10=110

VALUE-10=90


这是add.c文件:

#include<stdio.h>

intadd(int a,int b)

{

return a+b;

}

这是sub.c文件:

#include<stdio.h>

intsub(int a,int b)

{

return a-b;

}

这是first1.c文件:

#include<stdio.h>

#include"my.h"

main()

{


fprintf(stderr,"VALUE+10=%d\n",add(VALUE ,10));

fprintf(stderr,"VALUE-10=%d\n",sub(VALUE ,10));



}



5.3 动态链接


bear@bear-K40IE:~/program/third$vi first.c   

bear@bear-K40IE:~/program/third$gcc -fPIC -c first.c  //first.c返回的是乘法值

bear@bear-K40IE:~/program/third$ls

first.c first.o

bear@bear-K40IE:~/program/third$file first.o

first.o:ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), notstripped

bear@bear-K40IE:~/program/third$gcc -shared -o libabc.so first.o //添加动态链接库libabc.so,并将first.o链接文件加入其中

bear@bear-K40IE:~/program/third$ls

first.c first.o libabc.so

bear@bear-K40IE:~/program/third$vi sb.c

bear@bear-K40IE:~/program/third$ls

first.c first.o libabc.so sb.c

bear@bear-K40IE:~/program/third$gcc -c sb.c -O

bear@bear-K40IE:~/program/third$ls

first.c first.o libabc.so sb.c sb.o

bear@bear-K40IE:~/program/third$echo $LD_LIBRARY_PATH

bear@bear-K40IE:~/program/third$export LD_LIBRARY_PATH=./

bear@bear-K40IE:~/program/third$echo $LD_LIBRARY_PATH

./

bear@bear-K40IE:~/program/third$gcc sb.o -L./ -labc -s -o sb

bear@bear-K40IE:~/program/third$ls

first.c first.o libabc.so sb sb.c sb.o

bear@bear-K40IE:~/program/third$./sb

240is the result


这是first.c文件:

#include<stdio.h>

intfx(int a,int b)

{

return a*b;

}

这是sb.c文件:

#include<stdio.h>

main()

{

fprintf(stderr,"%d is theresult \n",fx(10,24));

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值