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