与Windows系统一样,Linux也有一个静态的动态链接库,下面是创建和使用的方法:

假设下面有几个文档:

头文件,字符串,h,声明相关函数的原始形式,内容如下:

Strlen.c: the implementation of the function Strlen to get the length of a given string, which is as follows:

Strlnen。C:功能StrNlen得到给定字符串的长度的实施。如果输入字符串的长度大于指定的最大长度,则返回最大长度,或者返回字符串的实际长度,如下所示:

生成静态库:

使用GCC生成相应的目标文件:

GCC ndash;C Strlen C Strnlen C。

如果在对应的文件没有错误,将GCC编译文件生成strlen。O和strnlen。两目标文件(相当于windows下的obj文件),然后一个叫libstr库文件,创建AR,和所有的内容。O和O strnlen插入。到相应的库文件,下面的命令如下:

AR ndash;钢筋混凝土libstr,strlen。O O strnlen。

执行该命令后,相应的静态库libstr已成功生成。

/ ***********************************

文件名:字符串。

描述:

作者:Hcj

日期:2006-5-7

************************************ /

Int Strlen(char * pstr);

Int StrNlen(char * pstr,unsigned long ulmaxlen);

/ **************************************

文件名:获取字符串长度

描述:

作者:Hcj

日期:2006 5 7

************************************** /

#包括

#包括

Int Strlen(char * pstr)

{

无符号长ullength;

断言(null)!= PSTR);

ullength = 0;

而(* pstr + +)

{

ullength + +;

}

返回ullength;

}

**********************************************

fileneme:mystrnlen C。

描述:获取输入字符串长度,如果字符串大

马克斯长度输入返回最大长度,

其他的实际长度

作者:Hcj

日期:2006-5-7

********************************************** /

#包括

#包括

Int StrNlen(char * pstr,unsigned long ulmaxlen)

{

长ullength符号;

断言(null)!= PSTR);

如果(ulmaxlen 0)

{

printf(错误的最大长度!;

返回- 1;

}

ullength = 0;

而(* pstr + ullength < ulmaxlen)

{

ullength + +;

}

返回ullength;

}

生成动态链接库:

GCC -fPIC -共享- O libstr.so strlen。C Strnlen C。

-fpic使输出目标模块是一个可重定位的地址模式生成。

共享指定相应的源文件进行相应的动态链接库文件libstr.so文件生成。

已经生成了相应的链接库,下面是如何使用相应的链接库。

静态库的使用:

假设有以下文件使用相应的静态库:

编译并生成相应的目标文件:

gcc的C -我/家庭/工作/ xxxxxxxx主C。

生成可执行文件:

GCC - O - L /主要家用 / / xxxxxxxx Hcj libstr主啊,

在这,我 / / / xxxxxxxx家Hcj和L /家庭/工作/ xxxxxxxx是相应的头文件和库文件,由我和L.Libstr的路。一个是相应的静态库的名称。相应的静态库被编译成相应的可执行程序,执行相应的可执行文件可以对应于函数调用的结果。

/ *****************************************

文件名:主C。

描述:测试静态/动态库

作者:Hcj

日期:2005-5-7

****************************************** /

#包括

#包括 / /静态库对应函数的头文件

int main(int argc、argv char * { })

{

charHello World};

无符号长ullength = 0;

printf(字符串:%s

ullength = Strlen(STR);

printf(字符串长度:%d(使用strlen)

ullength = StrNlen(STR,10);

printf(字符串长度:%d(使用strnlen)

返回0;

}

动态库分为两种调用方法:隐式调用和显式调用。

使用隐式调用类似于静态库的调用,下面是以下内容:

gcc的C -我/家庭/工作/ xxxxxxxx主C。

GCC - O - L /主要家用 / / xxxxxxxx Hcj主啊libstr.so / / *。所以在这里

这样说,我们需要保持配置文件 / / ld.so.conf等动态链接库,这样我们就可以使用动态链接库系统。我们通常将动态链接库的动态链接库的配置文件的目录名。否则,会有一个失败的加载动态链接库时,相关的可执行文件执行。编写动态库的引用时,可以用—编译gcc;l或L选项或要求动态链接库的直接引用。在Linux,LDD命令可以用来检查程序相关的共享库。

显式调用:

/ *****************************************

文件名:main2. C

描述:测试静态/动态库

作者:Hcj

日期:2005-5-7

****************************************** /

#包括

#包括

int main(int argc、argv char * { })

{

/ /定义功能点或

Int(* pstrlenfun)(char * pstr); / /函数声明与函数指针

Int(* pstrnlenfun)(char * pstr,int ulmaxlen);

charHello World};

无符号长ullength = 0;

void * pdlhandle;

char * pszerr;

pdlhandle = dlopen(。/ libstr.so,rtld_lazy);/ / / libstr.so加载链接库

如果(!PdlHandle)

{

printf(无法加载库);

}

pszerr = dlerror();

如果(pszerr!= null)

{

printf(%s

返回0;

}

从库中获取函数

pstrlenfun = dlsym(pdlhandle、Strlen); / /获得函数地址

pszerr = dlerror();

如果(pszerr!= null)

{

printf(%s

返回0;

}

pstrnlenfun = dlsym(pdlhandle,strnlen );

pszerr = dlerror();

如果(pszerr!= null)

{

printf(%s

返回0;

}

printf(字符串:%s

ullength = pstrlenfun(STR); / /调用相关函数

printf(字符串长度:%d(使用strlen)

ullength = pstrnlenfun(STR,10);

printf(字符串长度:%d(使用strnlen)

Dlclose(pdlhandle);

返回0;

}

gcc -o勉LDL C ASP。

GCC编译相应的源文件,以生成可执行文件——低密度脂蛋白选项,指示生成的对象模块需要使用共享库。

相关功能的描述如下:

(1)dlopen()

第一个参数:指定共享库的名称,并在下面的位置中找到指定的共享库。

-环境变量ld_library_path列出所有目录用分号间隔。

在文件 / / ld.so.cache等由要想发现库列表。

usr / lib目录。

-目录。

-当前目录。

第二个参数:指定如何打开共享库。

- rtld_now:加载所有功能在共享库到内存

- rtld_lazy:在共享库的函数加载操作将被推回来,和一个函数加载到dlsym()称为

(2)dlsym()

当构建共享库的调用,返回的phandle dlopen()和函数名作为参数,返回的函数的入口地址装入。

(3)dlerror()

此函数用于检查调用共享库的相关函数中的错误。

因此,我们使用一个简单的例子来说明Linux下静态动态库的创建和使用。