现在的位置: 首页 > 综合 > 正文

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

2014年08月29日 ⁄ 综合 ⁄ 共 2868字 ⁄ 字号 评论关闭

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));

}

抱歉!评论已关闭.