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

+++++++++++++++++++++++

++++++++++++++++++++++

/* Upper.h  */
#ifdef DLL_CWGK_ZC
#define EXPORT_SYMBOL extern
#else 
#define EXPORT_SYMBOL
#endif

EXPORT_SYMBOL 
char* UpperCase(char* targetStr);

+++++++++++++++++++++++

 

/* UseUpper.c */
#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

 

/* Upper.c */
#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;
}


原创粉丝点击