动态库与静态库的介绍和使用以及相应的指令

Linux 下静态库动态库(共享)的制作使用

Linux操作系支持的函数态库动态库动态库又称共享linux有几个重要的目存放相的函数,如/lib /usr/lib

函数

这类库的名字一般是libxxx.a;利用静函数库编译成的文件比大,因整个函数的所有数据都会被整合

中,他的点就而易了,即编译后的行程序不需要外部的函数支持,因所有使用的函数都已编译进行文件了。当然也会成他的缺点,因如果静函数了,那你的程序必重新编译,而且体大。

动态函数

这类库的名字一般是libxxx.so动态库又称共享;于静函数动态函数编译候并没有被编译进

中,你的程序行到相函数函数里的相函数,因此动态函数生的可行文件比小。由于函数没有被整合你的程序,而是程序运行时动态的申用,所以程序的运行境中必提供相动态函数的改并不影响你的程序,所以动态函数的升方便。而且如果多个用程序都要使用同一函数动态库就非常适合,可以减小用程序的体

下面来介linux函数建和使用:

例程add.h add.c sub.h sub.c main.c:

add.h

#ifndef ADD_H

#define ADD_H

int add(int x,int y);

#endif

add.c

#include< stdio.h>

#include "add.h"

int add(int x,int y)

{

return (x+y);

}

--------------------------------------------------------------------

sub.h

#ifndef SUB_H

#define SUB_H

int sub(int x,int y);

#endif

sub.c

#include< stdio.h>

#include "sub.h"

int sub(int x,int y)

{

return (x-y);

}

-----------------------------------------------------------------------

main.c

#include< stdio.h>

#include "sub.h"

#include "add.h"

int main()

{

int a,b;

a = add(1,2);

b = sub(10,5)

printf(“a=%d,b=%d\n”,a,b);

return 0;

}

----------------------------------------------------------------------


函数是由*.o

文件生成。

所以先 gcc -c add.c

gcc -c sub.c

生成add.o sub.o

函数ar命令


本例:ar -cr libaddsub.a add.o sub.o


-c create的意思

-r replace的意思,表示当插入的模名已中存在,同名的模。如果若干模中有一个模中不存在,ar示一个错误消息,并不替其他同名模。默的情况下,新的成增加在,可以使用其他任选项来改增加的位置。


到此静函数库创建完

操作静态库的几个实例:

情况1: 如果从别处得到一个静态库libunknown.a,想知道其中包含哪些模块。

命令:ar -t libunknown.a

本例:ar -t libaddsub.a

            add.o
            sub.o

情况2:如果想把sub.o移动到add.o前面

命令: ar  -mb add.o libaddsub.a sub.o

           ar -t libaddsub.a
          sub.o
          add.o

情况3:如果还有一个multiply.o,想把它加在add.o和sub.o中间

命令:ar -qa add.o libaddsub.a multiply.o

          ar -t libaddsub.a
          add.o
          multiply.o
          sub.o

使用方法:通gcc -o main main.c -L. -laddsub编译main.c就会把静函数整合main

其中

-L指定静函数的位置供找,注意L后面'.',表示静函数在本目找。

-l指定了静函数名,由于静函数的命名方式是lib***.a,其中的lib.a忽略。

根据静函数的特性,此处删libaddsub.amain依然可以运行,因态库的内容已整合去了。



在linux下制作动态库*.so。
 
1、linux下动态库的制作
//so_test.h
#include "stdio.h"
void test_a();
void test_b();
void test_c();
// test_a.c
#include " so_test.h "
void test_a()
{
printf( " this is in test_a...\n " );
}
// test_b.c
#include " so_test.h "
void test_b()
{
printf( " this is in test_b...\n " );
}
// test_c.c
#include " so_test.h "
void test_c()
{
printf( " this is in test_c...\n " );
}
生成动态库:libtest.so
# gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so
2、动态库与头文件位置
# cp  libtest.so  /lib/
# cp  so_test.h   /usr/include/
3、动态库的链接
测试程序
 
// test.c
#include <so_test.h>
int main()
{
   test_a();
   test_b();
   test_c();
    return 0 ;
}

 

将test.c与动态库libtest.so链接生成执行文件test:
#  gcc test.c -L. -ltest -o test
测试是否动态连接,如果列出libtest.so,那么应该是连接正常了
#  ldd test
4、编译参数解析
 
-shared:
该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号);
不用该标志外部程序无法连接,相当于一个可执行文件;
 
-fPIC:
表示编译为位置独立的代码;
不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的;
 
-L.:
表示要连接的库在当前目录中
 
-ltest:
编译器查找动态连接库时---隐含的命名规则[注释:libtest.so  ==  -ltest  /  libhello.so ==  -lhello ]
 
LD_LIBRARY_PATH:
这个环境变量指示动态连接器可以装载动态库的路径。
修改/etc/ld.so.conf文件,然后调用 /sbin/ldconfig来达到同样的目的,不过如果没有root权限,那么只能采用输出LD_LIBRARY_PATH的方法了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值