Linux函数库的创建方法

2016-02-19 16:23 2 1 收藏

有一种朋友不在生活里,却在生命力;有一种陪伴不在身边,却在心间。图老师即在大家的生活中又在身边。这么贴心的服务你感受到了吗?话不多说下面就和大家分享Linux函数库的创建方法吧。

【 tulaoshi.com - Linux教程 】

Linux下的函数库有静态库和动态库,两者有一定的区别,主要在于代码载入的时刻不同,下面图老师小编就给大家介绍下Linux静态库和动态库的创建,一起来学习下吧。

 Linux函数库的创建方法

静态库与动态库的创建与使用

1. 基本概念

静态库:链接时,库与编译生成的 .o 文件一起打包到可执行文件中。 linux / windows 下扩展名分别为:.a / .lib

动态库:链接时,不会打包到可执行文件中, 执行时会动态的加载动态库。 linux / windows 下扩展名分别为:.so / .dll

区别主要体现在:

a、可维护性。

合入更新。合入动态库的更新,只要替换库即可。但合入静态则需要重新链接,生成新的可执行程序,全量更新。

环境依赖。若包含静态库,编译成功后不依赖环境。动态库则存在依赖关系,需要环境中存在对应的动态库。

b、大小

空间利用率。若依赖相同静态库,则存在多份拷贝。

可执行文件大小。静态库文件较大。

c、动态库可以实现进程之间的资源共享,因此也称为共享库。

2. 静态库的创建与使用

静态库本质就是一组 .o 组成的压缩文件,扩展名为 .a / .lib

代码如下:

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)

ar -crv libXXX.a mmmm.o nnnn.o

XXX 是库名,mmmm.o nnnn.o 是要打包的目标文件。crv 参数,含义分别是

c: do not warn if the library had to be created

r: replace existing or insert new file(s) into the archive

v: be verbose

使用时,只需在代码中引入 头文件,链接时,指定静态库的搜索路径(-L选项)和静态库名(不需要lib前缀和.a后缀,-l选项)。

代码如下:

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)

g++ test.cpp -L.。/StaticLibrary -lXXX

3. 动态库

Window与Linux执行文件格式不同,在创建动态库的时候有一些差异。

Windows 下执行文件是 PE 格式,动态库需要一个DllMain函数做出初始化的入口,通常在导出函数的声明时需要有_declspec(dllexport)关键字。

Linux下 gcc 编译的执行文件默认是 ELF 格式,不需要初始化入口,亦不需要函数做特别的声明,编写比较方便。

linux 下动态库的命名格式同静态库,为 libXXX.so 格式。

动态库的创建,使用编译器即可,不需要像静态库一样使用专门的打包工具。

若要创建动态库,源码编译时添加 -fPIC 选项,链接时添加 -shared 选项。

代码如下:

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)

g++ -fPIC -shared -o libXXX.so xxx.cpp

用法同静态库,

代码如下:

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)

g++ test.cpp -L.。/DynamicLibrary -lXXX

只是需要设置下搜索路径。默认搜索路径:/lib/, /usr/lib。

设置搜索路径:

编辑 /etc/ld.so.conf,设置搜索路径

运行 ldconfig ,重建 /etc/ld.so.cache 文件。设置生效。

4. 相关工具

ldd 查看程序依赖的共享库(动态库)

代码如下:

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)

gcc / g++ 参数 -I(大写 ‘i’),-L(大写‘l’),-l(小写‘L’)

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)

1、 -I(大写 ‘i’) 头文件目录

2、-L(大写‘l’) 库目录

3、-l(小写‘L’) 库名

大写是目录,小写是库。

上面就是Linux中静态库和动态库的创建介绍了,通过本文的介绍相信你已经对Linux库有了一定的了解,静态库和动态的后缀名分别是.a和.so,可别弄错了哦。

来源:https://www.tulaoshi.com/n/20160219/1611933.html

延伸阅读
标签: PHP
  <?php // // SourceForge: Breaking Down the Barriers to Open Source Development // Copyright 1999-2000 (c) The SourceForge Crew // http://sourceforge.net // // $Id: database.php,v 1.6 2000/04/11 14:17:13 cvs Exp $ // // /etc/local.inc includes the machine specific database connect info function db_c...
标签: Web开发
?php$hidden_hash_var='your_password_here';$LOGGED_IN=false;//clear it out in case someone sets it in the URL or somethingunset($LOGGED_IN);/*create table user (user_id int not null auto_increment primary key,user_name text,real_name text,email text,password text,remote_addr text,confirm_hash text,is_conf...
在VC中使用MATLAB C/C++函数库 作者: 殷延伟 下载示例代码1 下载示例代码2 MATLAB广泛应用于线性代数、自动控制理论、数理统计、数字信号处理、时间序列分析、动态系统仿真等领域。因此如果在VC中对MATLAB进行调用将大大减少编程的工作量、保证程序的准确性,并且继承了VC++强大的功能,提高...
标签: Web开发
在PHP中有两套正则表达式函数库,两者功能相似,只是执行效率略有差异: 一套是由PCRE(Perl Compatible Regular Expression)库提供的。使用“preg_”为前缀命名的函数; 一套由POSIX(Portable Operating System Interface of Unix )扩展提供的(PHP默认)。使用以“ereg_”为前缀命名的函数; PHP中,正则表达式有三个作用: 匹配,也常...
标签: 电脑入门
pipe是Linux系统中的管道,管道机制的主体是pipe函数的调用,那么Linux系统要如何建立pipe函数呢?下面图老师小编就给大家介绍下Linux建立pipe函数的方法,一起来了解下吧。 ● 无名管道 主要用于父进程与子进程之间,或者两个兄弟进程之间。在linux系统中可以通过系统调用建立起一个单向的通信管道,且这种关系只能由父进程来建立。因...

经验教程

676

收藏

33
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部