关于静态链接库和动态链接库的几个问题

关于静态链接和动态链接的定义,借用《c专家编程》的话来说,静态连接:函数库的一份拷贝是可执行文件的物理组成部分。 动态链接:可执行文件只是包含了文件名, 让载入器在运行时能够寻找程序的所需要的函数库, 称之为动态链接。 简而言之, 静态链接就是把所需要的函数全部放在可执行文件中,故可以在脱离所需函数库的情况下也能够正常执行,但是可执行文件的比较大, 因为要包含所需要的函数,动态链接则是把所需要的函数库的名字包含在可执行文件中, 等到链接编译后,需要用到时,才根据文件名去寻找所需要的函数, 故依赖于在系统上的特定函数, 当没有这个函数的时候,就会造成运行时的错误。使用动态链接的可执行文件要小很多, 由于动态链接依赖于特定版本的函数,当函数升级版本后,无需重新编译,也可执行。这好像不是简而言之了, 有点唠叨 了,呵呵·····

下面说说如何创建静态链接库和动态链接库

假如有三个源文件:file.h, file.c, main.c

file.h

#ifndef _FILE_H

#define _FILE_H

#include<stdio.h>

 

void print(const char *str);

 

#endif

 

file.c

#include"file.h"

 

void print(const char *str)

{

    printf("%s\n", str);

}

 

main.c

#include"file.h"

 

int main(void)

{

    print("Welcome to the Linux");

    return 0;

}

静态链接库:

1. 首先要生成.o文件

 gcc -c file.c

2.使用ar命令来生成静态链接库libmyfileo.a(后缀.a表示archive)     

ar -cr libmyfile.a file.o

3. 生成可执行文件(file)

gcc -o file -L. -lmyfile main.c

(-L. 表示链接函数库的路径是当前目录, -lmyfile使用的是静态库libmyfile.a)

4.  ./file

Welcome to the Linux

最后说明, 即使把libmyfile.a删掉, 程序照样也能执行, 因为print函数已经是可执行文件file的组成部分了

 

动态链接库

1.和静态链接库的生成的第一步一样,首先也要生成.o文件(file.o)

gcc -c file.c

2.生成动态链接库libmyfile.so(后缀名so表示shared object)

gcc -shared -fPCI -o libmyfile.so file.o

3.生成可执行文件(file)

gcc -o file main.c -L.  -lmyfile

4.运行可执行文件file

./file

发生如下错误:./file: error while loading shared libraries: libmyfile.so: cannot open shared object file:No such file or directory 。 这是因为动态链接库的默认搜索路径是/usr/lib, /lib。

解决方法可以有:

1. 把libmyfile.so文件复制到/usr/lib目录下去。

2. 修改环境变量LD_LIBRARY_PATH(该环境变量可以指定动态链接库的搜索路径), 

export LD_LIBRARY_PATH=$(pwd) 

这个命令是把当前目录设为动态搜索路径的目录。

再次运行file文件, 发现再次出现错误:./file: error while loading shared libraries:  /root/libraray/libmyfile.so: cannot restore segment prot after reloc: Permission denied。出现这个问题的原因是由于SELinux的问题。

解决方法有:

1.修改/etc/selinux/config(永久性修改)

把SELINUX=enforcing 改为  SELINUX=disabled

2使用命令 /usr/sbin/setenforce 0 (本次有效, 下次启动后失效)

 

再次重新运行file文件

./file

Welcome to the Linux

 

呵呵, 这个关于静态链接库和动态链接库的问题就先说到这里, 不足之处, 还望各位大神指出。

 

 

 

 

                              

 

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值