数码资讯
解析Linux静态和动态链接库的创建和使用
选购提示
关注价格、性能、续航、售后和真实使用场景,理性比较后再下单。
与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下静态动态库的创建和使用。
假设下面有几个文档:
头文件,字符串,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下静态动态库的创建和使用。
声明:本文内容用于数码产品信息整理与选购参考,具体价格、库存、售后政策以官方渠道和电商页面实时信息为准。