Linux共享库(一)
来源:互联网 发布:稀疏a算法一致性条件 编辑:程序博客网 时间:2024/06/05 18:36
Linux中库文件有三种:静态、共享和动态。静态库的代码在编译时就已连接到开发人员开发的应用程序中,而共享库只是在程序开始运行时才载入,在编译时,只是简单地指定需要使用的库函数。动态库则是共享库的另一种变化形式。动态库也是在程序运行时载入,但与共享库不同的是,使用的库函数不是在程序运行开始,而是在程序中的语句需要使用该函数时才载入。动态库可以在程序运行期间释放动态库所占用的内存,腾出空间供其它程序使用。(这和Windows的库机制基本上是一样的,Windows的DLL使用LoadLibrary和FreeLibrary来在程序运行时对共享库进行加载和卸载)。
库文件的命名:
库文件名由前缀lib和库名以及后缀组成。根据库的类型不同,后缀名也不一样。共享库的后缀名由.so和版本号组成,静态库的后缀名为.a。例如:
libname.so.major.minor
libname.a
这里的name可以是任何字符串,用来唯一标识某个库。
库文件的位置:
在/usr/lib和/lib目录中可以找到绝大多数的共享库。连接时将首先搜索这两个目录。有一些库也可能存放在特定的目录中,在/etc/ld.conf配置文件中给出了这些目录的列表。连接程序也会对列出的这些目录进行搜索。在默认情况下,Linux将首先搜索指定库的共享版本,如果找不到,才会去搜索静态版本。
以下是制作共享库的例子。
制作共享库主要过程有两步:
1 生成 .o 文件。
gcc -c Upper.c -o Upper.o
2 将 .o 文件链接成库文件。
gcc -shared Upper.o -o libUpper.so
共享库的使用:
在文件UseUpper.c 使用了导出的函数UpperCase。
在测试该库时,可以使用环境变量LD_LIBRARY_PATH
用export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/the path of libUpper.so
然后编译链接UseUpper.c
gcc -o UseUpper UseUpper.c -lUpper -L/the path of libUpper.so
+++++++++++++++++++++++
++++++++++++++++++++++
#ifdef DLL_CWGK_ZC
#define EXPORT_SYMBOL extern
#else
#define EXPORT_SYMBOL
#endif
EXPORT_SYMBOL char* UpperCase(char* targetStr);
+++++++++++++++++++++++
#include "Upper.h"
#include <stdio.h>
#include <string.h>
int main()
{
char y[] = "adfbslek";
printf("%s ", UpperCase(y));
return 0;
}
注:
1.Shared Libraries(挺好的文章)
http://www.linux.org/docs/ldp/howto/Program-Library-HOWTO/shared-libraries.html
2."cannot restore segment prot after reloc: Permission denied"
http://bbs.chinaunix.net/thread-1088558-1-2.html
3. 2的解决办法,进一步可以学习一下SELinux
http://www.ittvis.com/services/techtip.asp?ttid=3092
4.Linux 共享库:尽量避免 LD_LIBRARY_PATH
http://jicknan.blogspot.com/2007/09/ldlibrarypath.html
LD_LIBRARY_PATH is not the answer -
http://prefetch.net/articles/linkers.badldlibrary.html
Why LD_LIBRARY_PATH is bad -
http://xahlee.org/UnixResource_dir/_/ldpath.html
LD_LIBRARY_PATH - just say no -
http://blogs.sun.com/rie/date/20040710
#include <string.h>
#include <stdlib.h>
#define DLL_CWGK_ZC
#include "Upper.h"
char* UpperCase(char* targetStr)
{
int LenStr;
int Index;
int Tmp;
if (targetStr == NULL)
return NULL;
LenStr = strlen(targetStr);
Index = 0;
for(; Index < LenStr; Index++)
{
if(!isalpha((int)targetStr[Index]))
return NULL;
}
Index = 0;
for(; Index < LenStr; Index++)
{
Tmp = targetStr[Index];
targetStr[Index]=(char)toupper(Tmp );
}
return targetStr;
}
- Linux共享库(一)
- linux静态库与共享库(一)
- linux静态库与共享库(一)
- Linux共享内存(一)
- Linux共享内存(一)
- QT Creator使用共享库(一)创建共享库
- linux进程通信(一)--共享内存--mmap()
- linux进程通信(一)--共享内存+信号量,代码示例
- linux进程通信(一)--共享内存+信号量
- linux 进程间通信(IPC)一共享内存
- linux进程通信(一)--共享内存+信号量,代码示例
- linux进程通信(一)--共享内存+信号量,代码示例
- Linux进程间通信--mmap共享内存(一)
- Linux进程间通信--shmget()共享内存(一)
- Linux 消息队列、共享内存、信号量(一)消息队列
- 静态库和共享库(一)
- linux 学习(一)---vm网络共享
- Linux共享内存的使用(一)
- 窗体事件驱动链分析
- jsp重复提交数据
- 如何避免成为技术官僚?
- SQL Server的六种数据移动方法
- 基本图象处理代码
- Linux共享库(一)
- DLL 导出类必须要导出接口
- 白岩松:我们应从家乐福事件中跳出来
- SQL Server数据库安全规划全攻略
- 胡思乱想之基于内容的音乐搜索
- 精妙SQL语句
- [转]Orcle and SQL Functions (http://jim.blueidea.com/archives/2006/3715.shtml)
- SQL函数设计之临时表的使用
- 搞笑