关于静态链接库和动态链接库的几个问题
来源:互联网 发布:拳击手套 知乎 编辑:程序博客网 时间:2024/06/05 15:40
关于静态链接和动态链接的定义,借用《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
呵呵, 这个关于静态链接库和动态链接库的问题就先说到这里, 不足之处, 还望各位大神指出。
- 关于静态链接库和动态链接库的几个问题
- 关于C和C++动态链接库的几个问题
- 关于C和C++动态链接库的几个问题
- 关于静态链接库和动态链接库
- 关于静态链接库和动态链接库
- 关于静态链接库和动态链接库
- 静态库链接、动态库静态链接和动态链接
- 关于静态库和动态库的链接
- 关于静态库和动态库的链接
- 静态链接库和动态链接库
- 静态链接库和动态链接库
- 静态链接库和动态链接库
- 动态链接库和静态链接库
- 静态链接库和动态链接库
- 静态链接库和动态链接库
- 静态链接库和动态链接库
- 静态链接库和动态链接库
- 静态链接库和动态链接库
- redhat rpm 相关问题。。。
- linux__时间__操作
- linux__链表__操作
- Ext.apply详解
- Initialization Parameters
- 关于静态链接库和动态链接库的几个问题
- 排序算法(二):直接选择排序
- Google 地图切片URL地址解析
- 字符串处理 - ANSI - Unicode - UTF8 转换
- NSData 与 NSString,Byte数组,UIImage 的相互转换
- 状态码200,301,302,404,500
- 【Android 开发教程】ListView的基本使用
- 微速(微锐) 与 打码工作
- C++学习笔记