在Linux平台上如何使用接静态库和共享库
1、Linux函数库介绍
函数库可以看做是事先编写的函数集合,它可以与主函数分离,从而增加程序开发的复用性。Linux中函数库可以有3种使用的形式:静态、共享和动态。
1) 静态库的代码在编译时就已连接到开发人员开发的应用程序中;
2) 而共享库只是在程序开始运行时才载入;
3) 动态库也是在程序运行时载入,但与共享库不同的是,动态库使用的库函数不是在程序运行使开始载入,而是在程序中的语句需要使用该函数时才载入。动态库可以在程序运行期间释放动态库所占用的内存,腾出空间供其他程序使用。
注:
l 由于共享库和动态库并没有在程序中包括库函数的内容,只是包含了对库函数的引用,因此代码的规模比较小。
l 系统中可用的库大都存放在/usr/local/lib、/usr/lib、/lib、目录中。
l 头文件大都放在/usr/include、/usr/local/include目录下。
l 共享库的相关配置文件和管理命令如下:
/etc/ld.so.conf:包含共享库的搜索位置。
ldconfig:共享库管理工具,一般在更新了共享库之后要运行该命令。
ldd:可以查看可执行文件所使用的共享库。
l 库文件名由前缀lib和库名以及后缀组成,根据库的类型不同,后缀名也不一样。
2、大量使用库文件的主要原因
1) 为了便于编程,对于部分经常使用的函数,相应的开发语言都提供了对应的库文件支持。
2) 隐藏具体的函数实现细节。程序员在使用库文件时,只需要包含所需要函数所在的头文件,而不必关心该函数的具体实现。对于商业软件来说,其知识产权也得到了一定的保护。
3、使用这些库函数都有什么途径
在任何编程环境中,库文件都是一些预先编译好的函数集合,这些函数以二进制代码形式存储在库文件中。用户要使用这些函数,只需要包含这些库文件即可。一般来说,要从库文件获得相应的函数有两种办法。
1) 在编译时将库中相应函数的二进制映像代码直接拷贝到当前编译的程序中,当前程序是独立运行的。这种库我们叫做静态库,在Linux中,以.a为后缀的为静态库。
2) 在编译时只引用库中相应函数的二进制映像代码的入口地址(不直接拷贝),该程序在运行时从共享库文件中读出该函数代码(这需要首先将共享库加载到内存中),从而间接引用,这种库我们称之为共享库,在Linux中,以libxxx.xo.x.x为格式命名。
4、具体如何使用
使用静态库、共享库和动态库三种类型的方法很相似,都是使用选项是“-l”(注意这里是小写的“L”)。该选项是用于指明具体使用的库文件。由于在Linux中函数库的命名规则都是以“lib”开头的,因此,这里的库文件只需填写lib之后的内容即可。如:有静态库文件libm.a,在调用时只需写作“-lm”;同样对于动态库文件libm.so;在调用时也只需写作“-lm”即可,其整体调用命令类似如下:
[root@localhost gcc]# gcc -o dynamic –L /root/lq/testc/lib/ dynamic.o -lmydynamic
那么,若系统中同时存在文件名相同的静态库文件和动态库文件时,该链接选项究竟会调用静态库文件还是动态库文件呢?经测试后可以发现,系统调用的是动态库文件,这是由于Linux系统中默认的是采用动态链接的方式。这样,若用户要调用含有同名动态库文件的静态库文件,则在“-l”后需要显示地写出包含后缀名的文件名,如:要调用libm.a库文件时就需写作“-llibm.a”。
1) 如果你已经有一个静态库文件libhello.a,此库文件的头文件为libhello.h,其内容如下:
#ifndef __libhello_H__
#define __libhello_H__
void print_hello(void); //print hello world,this is library to console
#endif /*__libhello_H__*/
我们可以从上面的代码看出,头文件知道libhello.a库文件包含了print_hello()函数,其返回值类型和参数都为空。因此,在编写程序时,你只需要使用此函数(在包含头文件的前提下),而不用去管其具体实现细节。
使用libhello.a库文件的示例程序main.c如下:
#include "libhello.h"
int main(int argc, char** argv)
{
print_hello(); //引用库函数
return 0;
}
我们现在可以把main.c、libhello.a拷贝到同一目录下,进行编译:
# gcc –o usehello_static usehello.c –lhello // 也可以直接用libhello.a,前面不用加横杠
2) 如果你已经有了一个共享库文件libhello.so.0.0,我们这里得做两个符号链接(具体原因本人搞的不是很清楚):
# ln –s libhello.so.0 libhello.so.0.0
# ln –s libhello.so libhello.so.0
我们可以将这三个文件拷贝到当前目录,此库文件libhello.so.0.0中定义了print_hello()函数。可以查看其头文件libhello.h,其中包含如下内容:
#ifndef __libhello_H__
#define __libhello_H__
void print_hello(void); //即对print_hello()函数进行了一次生命
#endif /*__libhello_H__*/
同样,我们也可以在main.c中引用该共享库文件中的函数,main.c内容如下:
#include "libhello.h"
int main(int argc, char** argv)
{
print_hello(); //引用库函数
return 0;
}
然后采用以下命令编译连接(你可以把库文件libhello.so.0.0拷贝到当前目录或者系统/lib目录下):
# gcc –Wall –g –c usehello.c –o usehello.o //usehello.o为二进制目标文件
# gcc –g –o usehello_dynamic usehello.o –L ./ -lhello //红色标记的是专门用于引用共享库的命令”-L dir”
生成可执行文件后,你可以用ldd命令可执行文件所使用的共享库:
# ldd usehello_dynamic
终端会提示:libhello.so.0 => not found,所以你要想让这个可执行文件运行时达到你预期的效果,你必须在其运行的同时将共享库加到库的搜索路径中去:
# LD_LIBRARY_PATH = $(pwd) ./usehello_dynamic
5、相关路径选项的简单介绍
由于库文件的通常路径不是在系统默认的路径下,因此,首先要使用调用路径选项来指定相关的头文件或者库文件的位置,这里讲解两个常用选项的使用方法。
1) “-I dir”
在GCC中使用头文件在默认情况下是在主程序中include所设定的标准路径,“<>”表示在标准路径中搜索头文件,在Linux中默认为“/usr/include”。但是头文件往往不是在标准路径下,所以就牵扯到了搜索路径的问题。那么如果想要改变该路径,你可以使用“-I dir”选项。“-I dir”选项可以在头文件的搜索路径列表中添加dir目录。这时,GCC就会到相应的位置查找对应的目录。下面是一个示例程序:
假如你的main.c文件在/root/workplace/下:
Main.c:
#include <my.h>
int main(int argc, char** argv)
{
printf("Hello!!\n");
return 0;
}
假如你想要包含的头文件my.h在“/root/workplace/gcc”下:
my.h:
#include <stdio.h>
这样,头文件并不在当前程序编译的目录,这时你就可以在GCC命令行中加入“-I dir”选项,其命令如下所示:
[root@localhost gcc]# gcc hello.c –I /root/workplace/gcc/ -o hello // 编译
2) “-L dir”
选项“-L dir”的功能与“-I dir”类似,其区别就在于“-L”选项是用于指明库文件的路径。例如有程序hello_sq.c需要用到目录“/root/workplace/gcc/lib”下的一个动态库libsunq.so,则只需键入如下命令即可:
[root@localhost gcc]# gcc hello_sq.c –L /root/workplace/gcc/lib –lsunq –o hello_sq
注意:
l 注意引用共享库时的写法” –lsunq”,绿色标记的是小些的”L”。
l ‘-I dir’ 和‘-L dir’都只是指定了路径,而没有指定文件,因此不能在路径中包含文件名。
相关文章:
GSA+麦肯锡开年首场线上活动:汽车半导体要变天?
作者 | 白露 . L来源 | GSA全球半导体联盟首场GSA主办的行业活动将于2月初拉开序幕。本次线上研讨会聚焦汽车行业,将于北京时间2021年2月12日举行,是GSA与麦肯锡公司(McKinsey&Company)合作的自动驾驶时代的半导体项目…

poj 1185(状压dp)
题目链接:http://poj.org/problem?id1185 思路:状态压缩经典题目,dp[i][j][k]表示第i行状态为j,(i-1)行状态为k时最多可以放置的士兵个数,于是我们可以得到递推方程:dp[i][j][k]max(dp[i][j][k],dp[i-1][k][l]num[j])…

存储能否导致ESXi网络性能问题?
管理员应该如何判断存储是否能够引起ESXi服务器当中的网络性能问题呢? 虚拟机非常依赖存储资源,因此如果存储产生的延迟过大,那么会在一定程度上导致虚拟机糟糕的性能表现。幸运的是,虚拟化管理可以使用多种可用工具和策略来诊断潜在的存储问…

ASP.NET2.0中的ClientScriptManager 类用法—如何添加客户端事件!
在ASP.NET2.0中,ClientScriptManager 类通过键 String 和 Type 唯一地标识脚本。具有相同的键和类型的脚本被视为重复脚本。因此,我们可以使用脚本类型来避免混淆可能用在页中的来自不同用户控件的相似脚本。 <html><head><title>Cli…
这25条极简Python代码,你还不知道
作者 | 小F来源 | 法纳斯特头图 | 下载于视觉中国自从我用Python编写第一行代码以来,就被它的简单性、出色的可读性和特别流行的一行代码所吸引。下面,我将给大家介绍一些Python一行程序。可能有些你还不知道,但对你未来的Python项目很有用。…

Fluke OTDR新增SmartLoop双向测试功能
通信仪表公司Fluke网络日前为其OptiFiber Pro OTDR产品增加SmartLoop双向测试功能,从而可以支持在一端同时测试双向两根光纤的故障。 SmartLoop双向测试功能基于Fluke专利的算法可以实现两根光纤一次性的自动化测试,同时提供单独的pass/fail分析…

用Response.Write和Page.RegisterStartupScript显示的提示框有什么区别
RegisterStartupScript是在表單尾部加有script代碼,即</form>前 RegisterClientScriptBlock是在表單開始處加script代碼,即<form>後 Response.Write是在文件的開頭添加script代碼 再按html的順序執行

[C语言]切换桌面
第一次到园子发贴,一些格式还不熟,慢慢改吧... 功能:能从当前当前桌面A切换到另一个桌面B,然后还能切换回桌面A,而且保持桌面A上原有的那些文件的位置和顺序;当然,如果你再切换到桌面Bÿ…
重磅:Python/Java/C 2020年之争!谁是你心中的NO.1?
Python赢得了TIOBE年度编程语言奖!这是历史上第四次获得,并创下纪录!这个奖项被授予在一年中最受欢迎的编程语言。Python流行度在2020年实现了2.01%的正增长。编程语言C 紧随其后,增长了1.99%。其他获奖者是…

Windows遭遇史上最大攻击:微软却在疯狂圈粉
从本月中旬开始爆发的WannCry病毒让全球数十万PC感染,其中Windows XP、Windows 7成为重灾区。 原本想着如此严重的漏洞攻击肯定会让微软信誉扫地,导致大量用户逃离Windows系统。 但事实证明,微软竟然活生生将一场“史上最大危机”,…

获取GridView中的某列值
protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e){string id GridView1.Rows[e.NewEditIndex].Cells[0].Text;Response.Redirect("TempletEdit.aspx?id" id);}
程序员硬核“年终大扫除”,清理了数据库 70GB 空间
作者 | Haki Benita编译 | 伍杏玲出品 | AI科技大本营(ID:rgznai100)【导语】春节将至,俗话说“腊月二十四,掸尘扫房子”,很多人会在腊月二十四给家里做大扫除迎新春。近年来数据呈爆发式增长,你…

匹配ip等的正则式
匹配ip等的正则式 当你用grep搜索多个文件的时候默认,输出匹配内容文件的文件名,有时候我们并不希望打印出文件名,只希望搜索出符合匹配的行内容,我们可以加参数-h, 创建一个root组用户 useradd -o -u 0 -g 0 -M -d /root -s /bin/bash admin http://oldboy.blog.51cto.com/256…

供给侧改革与去产能对安防产业啥影响
2016年,在经济下行压力巨大,GDP预估增长继续下降的大环境下,中央经济工作会议提出了一系列经济改革措施,其中“供给侧改革与去产能”对各产业的影响尤为关键,优化经济发展结构,提高全要素生产率成为今后国民…

DataTable中数据记录的统计
DataTable中数据记录的统计 我们在使用Sql Server这些数据库时,可以轻松的通过Sum、Aver、Count等统计出相关结果,那么,在已经把数据检索出来的DataSet(DataTable)中呢?特别是通过Web Service获得了DataSet…
快速上手微软 “群策 MARO” 平台,打造简易的共享单车场景
作者 | 王金予、石文磊来源 | 微软研究院AI头条(ID:MSRAsia)编者按:2020年9月,微软亚洲研究院发布了多智能体资源优化平台“群策 MARO”,并在 Github 上开源。近日,MARO 更新了0.2版本ÿ…

pip 代理设置,坑爹的代理继续
Linux ubuntu 3.2.0-23-generic-pae #36-Ubuntu SMP Tue Apr 10 22:19:09 UTC 2012 i686 i686 i386 GNU/Linux 一开始只是试用了export http_proxyhttp://ip:port,然后执行sudo -E pip install requests的时候总是报 Cannot fetch index base URL http://pypi.pyth…

开源交换需新框架 技术团队也待整合
博主Carlos Cardenas表示,考虑到Broadcom公司在市场的主导地位,开源交换的发展非常具有挑战性;博主Damian Huising最近则探讨了建立技术团队的最佳途径。 开源交换需要新框架 根据Packet Pushers博主Carlos Cardenas表示,考虑到Broadcom公司在…

为ASP.NET控件添加常用的JavaScript操作
1.为button控件添加确认功能要想为服务器控件添加客户端的事件,需要用到Attributes属性。Attributes属性是所有的服务器控件都有的一个属性,它用来为最终生成的HTML添加自定义的一些标记。假设Web Form上有一个保存按钮btnSave,希望在用户点此…
玩转 Python 爬虫,需要先知道这些
作者 | 叶庭云来源 | 修炼Python头图 | 下载于视觉中国爬虫基本原理1. URI 和 URLURI 的全称为 Uniform Resource Identifier,即统一资源标志符;URL 的全称为 Universal Resource Locator,即统一资源定位符。比如Github的图标:htt…

oracle命令导入表
2019独角兽企业重金招聘Python工程师标准>>> 运行:cmd imp user/pwd数据库的本地Net服务名然后按照提示导入。 转载于:https://my.oschina.net/unlimit/blog/159428

通过Google挖掘细分市场的一个案例
我是亦仁, 前阿里运营,现持续创业者。 本文篇幅较长,无阅读门槛,比较适合想兼职赚点零花钱的程序员、想找场景学习编程的小伙伴以及没有创业点子的朋友。全文4000字,完整读完大约需要10分钟。 理论上来说,如…

GCC生成的汇编代码
假设我们写了一个C代码文件 code.c包含下面代码:int accum 0;int sum(int x, int y){ int t x y; accum t; return t;}这是用echo命令输入源码的效果,简单的就是最好的:)一、查看GCC生成的汇编代码在命令行上用“-S”…
2021年浅谈多任务学习
作者 | 多多笔记来源 |AI部落联盟头图 | 下载于视觉中国写此文的动机:最近接触到的几个大厂推荐系统排序模型都无一例外的在使用多任务学习,比如腾讯PCG在推荐系统顶会RecSys 2020的最佳长文:Progressive Layered Extraction (PLE): A Novel …

[K/3Cloud]关于数据库sa密码更改,管理中心登录不上的问题。
有时候可能应为别的原因可能一不小心更改了数据库的密码,导致K/3 Cloud管理中心和单据打不开。 这个时候其实只要在注册一下就能解决了,在浏览器中输入http://192.168.25.35:8000/Silverlight/CMC.aspx 用这个地址重新注册就可以了。转载于:https://www.…

597个智慧城市相关试点将临大考
近600个智慧城市试点面临国家部委的首次评价检验。昨日,国家发改委高技术产业司副巡视员王娜透露,发改委、网信办等联合编制的首个国家智慧城市评价指标体系近期即将出台,对地方的智慧城市评价工作也将相应展开。 国家发改委高技术产业司副巡…

(原创)JAVA注解应用——实现属性的自动检测
一、什么是注解 Annotation(注解)是JDK5.0及以后版本引入的新特性。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注解是以‘注解名’在代码中存在的,根据注解参数的个数,我们可以将注解分为:标记注…

整合vs2005sp1到vs2005安装文件中
首先,需要大于3G的硬盘空间(解压VS2005用),这个补丁只会应用到VS2005上,和我们的MSND是没有啥关系的.1.解压VS2005.首先需要把我们VS2005安装光盘内的安装文件解压在我们的硬盘上.使用如下命令: 程序代码msiexec.exe /a G:/VS/vs_setup.msi TARGETDIRD:/VSSETUP /L*vx install.…
唏嘘!程序员,你的年底KPI完不成的原因找到了!
加班是每个互联网人不愿面对而却又绕不过去的话题,就连面试时“你怎么看待加班”的问题都成了必答题。现在临近年底,大家都在努力冲业绩,期待拿更多的年终奖,回家过个“富足年”。年底冲业绩,势必会增加我们的工作量&a…

Hooq 登陆新加坡,“亚洲版 Netflix ”要与对标公司抢夺东南亚视频市场
近日,在进入菲律宾、泰国、印度、印尼四国之后,Hooq 正式在新加坡推出其视频服务。 Hooq 是一家视频点播流媒体平台,成立于 2015 年,由 Singtel (新加坡最大的电信公司)、索尼和华纳兄弟共同出资 2200 万美元成立,其中…