函数库动态链接库so的编译与使用

无法定位程序输入点于动态链接库上  时间:2021-02-27  阅读:()

动态链接库so的编译与使用

精品好文档推荐学习交流

动态链接库*.so的编译与使用- -

动态库*.so在linux下用c和c++编程时经常会碰到最近在网站找了几篇文章介绍动态库的编译和链接总算搞懂了这个之前一直不太了解得东东这里做个笔记也为其它正为动态库链接库而苦恼的兄弟们提供一点帮助。

1、动态库的编译

下面通过一个例子来介绍如何生成一个动态库。这里有一个头文件 so_te st.h三个.c文件 te st_a.c、 test_b.c、 test_c.c我们将这几个文件编译成一个动态库 libtest.so。so_t e st.h

#include<stdio.h>

#include<stdlib.h>void test_a();void test_b();void test_c();te st_a.c

#include"so_test.h"void test_a()

{

仅供学习与交流如有侵权请联系网站删除谢谢2

精品好文档推荐学习交流

printf("this is in test_a. . .\n");

}te st_b.c

#include"so_test.h"void test_b()

{printf("this is in test_b. . .\n");

}te st_c.c

#include"so_test.h"void test_c()

{printf("this is in test_c. . .\n");

}

将这几个文件编译成一个动态库 l ibtest.so

$gcc test_a.ctest_b.c test_c.c -fPIC-shared -o libtest.so

2、动态库的链接

在1、 中我们已经成功生成了一个自己的动态链接库libtest.so下面我们通过一个程序来调用这个库里仅供学习与交流如有侵权请联系网站删除谢谢3

精品好文档推荐学习交流

的函数。程序的源文件为 test.c。te st.c

#include"so_test.h"int main()

{te st_a();te st_b();te st_c();retu rn 0;

}l 将test.c与动态库libtest.so链接生成执行文件test

$gcc test.c-L. -ltest -otestl 测试是否动态连接如果列出libte st.so那么应该是连接正常了

$ ldd test

./t e st 执行te st可以看到它是如何调用动态库中的函数的。

3、编译参数解析

最主要的是GCC命令行的一个选项:

-sh are d该选项指定生成动态连接库让连接器生成T类型的导出符号表有时候也生成弱连接W类型的导出符号 不用该标志外部程序无法连接。相当于一个可执行文件l -fPIC表示编译为位置独立的代码不用此选项的话编译后的代码是位置相关的所以动态载入时仅供学习与交流如有侵权请联系网站删除谢谢4

精品好文档推荐学习交流

是通过代码拷贝的方式来满足不同进程的需要而不能达到真正代码段共享的目的。l -L. 表示要连接的库在当前目录中l -lte st编译器查找动态连接库时有隐含的命名规则 即在给出的名字前面加上lib后面加上.so来确定库的名称l LD_LIBRARY_PATH这个环境变量指示动态连接器可以装载动态库的路径。l 当然如果有root权限的话可以修改/etc/ld.so.co nf文件然后调用/sb in/ld co nfig来达到同样的目的不过如果没有root权限那么只能采用输出LD_LIBRARY_PATH的方法了。

4、注意

调用动态库的时候有几个问题会经常碰到有时 明明已经将库的头文件所在目录通过“-I”include进来了库所在文件通过“-L”参数引导并指定了“-l”的库名但通过ldd命令察看时就是死活找不到你指定链接的so文件这时你要作的就是通过修改LD_LIBRA RY_PAT H或者/etc/ld.so.co n f文件来指定动态库的目录。通常这样做就可以解决库无法链接的问题了。m a kefi l e里面怎么正确的编译和连接生成.so库文件然后又是在其他程序的ma kefi l e里面如何编译和连接才能调用这个库文件的函数????

答:

你需要告诉动态链接器、加载器ld.so在哪里才能找到这个共享库,可以设置环境变量把库的路径添加到库目录/l ib和/usr/lib LD_LIBRARY_PATH=$(pwd),这种方法采用命令行方法不太方便,一种替代方法

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

注释^^^^^^^^^^^^^^^^^^^^^^^^^^^^

仅供学习与交流如有侵权请联系网站删除谢谢5

精品好文档推荐学习交流

LD_LIBRARY_PATH可以在/etc/profi le还是~/.profi le还是./bash_profi le里设置或者.bashrc里

改完后运行sou rce/etc/profi l e或. /etc/profi l e

更好的办法是添入/etc/l d.so.co nf,然后执行/sb i n/l d co nfi g

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

注释^^^^^^^^^^^^^^^^^^^^^^^^^^^^

是把库路径添加到/etc/l d.so.co nf然后以root身份运行l d co nfi g

也可以在连接的时候指定文件路径和名称-I -L.

G C C=g cc

CFLAGS=-Wal l -ggdb-fPIC

#CFLAGS=al l : l ibfunc testl ibfunc:func.o func1.o

$(GCC) -shared-Wl,-soname,l ibfunc.so.1 -o libfunc.so.1.1 $<ln -sf l ibfunc.so.1.1 libfunc.so.1ln -sf l ibfunc.so.1 l ibfunc.so

***********************************************注释************

************************************ln-s是用来创建软链接也就相当于windows中的快捷方式在当前目录中创建上一级目录中的文件ttt的命名为ttt2软链接的命令是l n-s . ./ttt ttt2,如果原文件也就是ttt文件删除的话 ttt2也变成了空文件。l n-d是用来创建硬链接也就相当于windows中文件的副本 当原文件删除的仅供学习与交流如有侵权请联系网站删除谢谢6

精品好文档推荐学习交流

时候并不影响“副本”的内容。

编译目标文件时使用g cc的-fPIC选项产生与位置无关的代码并能被加载到任何地址gcc–fPIC–g–c l iberr.c–o l iberr.o

使用gcc的-shared和-soname选项

使用gcc的-Wl选项把参数传递给连接器ld

使用g cc的-l选项显示的连接C库 以保证可以得到所需的启动sta rtu p代码从而避免程序在使用不同的可能不兼容版本的C库的系统上不能启动执行。gcc–g–shared–Wl,-soname,l iberr.so–o liberr.so.1.0.0 l iberr.o–lc

建立相应的符号连接ln–s l iberr.so.1.0.0 liberr.so.1;ln–s l iberr.so.1.0.0 liberr.so;

在MAKEFILE中

$@

表示规则中的目标文件集。在模式规则中如果有多个目标那么 "$@"就是匹配于目标中模式定义的集合。

$%

仅当目标是函数库文件中表示规则中的目标成员名。例如如果一个目标是"foo.a(bar.o)"那么 "$%"就是"bar.o" "$@"就是"foo.a"。如果目标不是函数库文件Unix下是[.a]Windows下是[. l ib] 那么其值为空。$<

依赖目标中的第一个目标名字。如果依赖目标是以模式即"%"定义的那么"$<"将是符合模式的一系列的文件集。注意其是一个一个取出来的。$?

所有比目标新的依赖目标的集合。 以空格分隔。

$^

所有的依赖目标的集合。 以空格分隔。如果在依赖目标中有多个重复的那个这个变量会去除重复的依赖目标只保留一份。

*********************************************注释

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

********

仅供学习与交流如有侵权请联系网站删除谢谢7

精品好文档推荐学习交流

test: test.o l i bfu nc

$(GCC) -o test test.o-L. -lfunc

%.o:%.c

$(GCC) -c$(CFLAGS) -o$@$<clean:rm-fr*.orm-fr*.so*r m-fr test

要生成.so文件 cc要带-shared参数要调用.so的文件 比如l ibfu nc.so,可以在cc命令最后加上-lfu nc还要视情况加上-L/usr/xxx指出l i bfu nc.so的路径这样在你要编译的源文件中就可以调用l i bfu nc.so这个库文件的函数.

前面的都说的差不多了最后提醒一下最好提供一个接口头文件

动态加载,用dlopen,dlclose,dlsymref:http://niefei .blog.ccidnet.com/blog/ccid/do_showone/tid_42855.htm l

1.介绍

使用GNU的工具我们如何在Linux下创建自己的程序函数库?一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据这些编译好的代码和数据可以在事后供其他的程序使用。程序函数库可以使整个程序更加模块化更容易重新编译而且更方便升级。程序函数库可分为3种类型静态函数库static l ibraries 、共享函数库shared l ibraries和动态加载函数库

dynamical ly loaded l ibraries 。

静态函数库是在程序执行前就加入到目标程序中去了而共享函数库则是在程序启动的时候加载到程序中它可以被不同的程序共享动态加载函数库则可以在程序运行的任何时候动态的加载。实际上动态函数库并非另外一种库函数格式区别是动态加载函数库是如何被程序员使用的。后面我们将举例说明。

本文档主要参考Program Library HOWTO作者是luster

hwa n g@u stc.ed u 任何非商业目的的再次发行本文档都是允许的但是请保留作者信息和本版权声明。本文档首先在www. l inuxaid.com.cn发布。

2.静态函数库

静态函数库实际上就是简单的一个普通的目标文件的集合一般来说习惯用“.a”作为文件的后缀。可以用ar这个程序来产生静态函数库文件。 Ar是archiver的缩写。静态函数库现在已经不在像以前用得那么多了主要是共享函数库与之相比较有很多的优势的原因。慢慢地大家都喜欢使用共享函数库了。不过在一些场所静态函数库仍然在使用一来是保持一些与以前某些程仅供学习与交流如有侵权请联系网站删除谢谢8

精品好文档推荐学习交流

序的兼容二来它描述起来也比较简单。

静态库函数允许程序员把程序l ink起来而不用重新编译代码节省了重新编译代码的时间。不过在今天这么快速的计算机面前一般的程序的重新编译也花费不了多少时间所以这个优势已经不是像它以前那么明显了。静态函数库对开发者来说还是很有用的例如你想把自己提供的函数给别人使用但是又想对函数的源代码进行保密你就可以给别人提供一个静态函数库文件。理论上说使用ELF格式的静态库函数生成的代码可以比使用共享函数库或者动态函数库的程序运行速度上快一些大概15。

创建一个静态函数库文件或者往一个已经存在地静态函数库文件添加新的目标代码可以用下面的命令ar rcs my_l ibrary.a file1.o file2.o

这个例子中是把目标代码fi le1.o和file2.o加入到my_l i brary.a这个函数库文件中如果my_l ibrary.a不存在则创建一个新的文件。在用ar命令创建静态库函数的时候还有其他一些可以选择的参数可以参加ar的使用帮助。这里不再赘述。

一旦你创建了一个静态函数库你可以使用它了。你可以把它作为你编译和连接过程中的一部分用来生成你的可执行代码。如果你用g cc来编译产生可执行代码的话你可以用“-l”参数来指定这个库函数。你也可以用ld来做使用它的“-l”和“-L”参数选项。具体用法可以参考info:gcc。

3.共享函数库

共享函数库中的函数是在当一个可执行程序在启动的时候被加载。如果一个共享函数库正常安装所有的程序在重新运行的时候都可以自动加载最新的函数库中的函数。对于Linux系统还有更多的可以实现的功能o升级了函数库但是仍然允许程序使用老版本的函数库。 o当执行某个特定程序的时候可以覆盖某个特定的库或者库中指定的函数。 o可以在库函数被使用的过程中修改这些函数库。

3.1.一些约定

如果你要编写的共享函数库支持所有有用的特性你在编写的过程中必须遵循一系列约定。你必须理解库的不同的名字间的区别例如它的“soname”和“real name”之间的区别和它们是如何相互作用的。你同样还要知道你应该把这些库函数放在你文件系统的什么位置等等。下面我们具体看看这些问题。仅供学习与交流如有侵权请联系网站删除谢谢9

提速啦(24元/月)河南BGP云服务器活动 买一年送一年4核 4G 5M

提速啦的来历提速啦是 网站 本着“良心 便宜 稳定”的初衷 为小白用户避免被坑 由赣州王成璟网络科技有限公司旗下赣州提速啦网络科技有限公司运营 投资1000万人民币 在美国Cera 香港CTG 香港Cera 国内 杭州 宿迁 浙江 赣州 南昌 大连 辽宁 扬州 等地区建立数据中心 正规持有IDC ISP CDN 云牌照 公司。公司购买产品支持3天内退款 超过3天步退款政策。提速啦的市场定位提速啦主...

热网互联33元/月,香港/日本/洛杉矶/韩国CN2高速线路云主机

热网互联怎么样?热网互联(hotiis)是随客云计算(Suike.Cloud)成立于2009年,增值电信业务经营许可证:B1-20203716)旗下平台。热网互联云主机是CN2高速回国线路,香港/日本/洛杉矶/韩国CN2高速线路云主机,最低33元/月;热网互联国内BGP高防服务器,香港服务器,日本服务器全线活动中,大量七五折来袭!点击进入:热网互联官方网站地址热网互联香港/日本/洛杉矶/韩国cn2...

DiyVM:499元/月香港沙田服务器,L5630*2/16G内存/120G SSD硬盘/5M CN2线路

DiyVM是一家成立于2009年的国人主机商,提供的产品包括VPS主机、独立服务器租用等,产品数据中心包括中国香港、日本大阪和美国洛杉矶等,其中VPS主机基于XEN架构,支持异地备份与自定义镜像,VPS和独立服务器均可提供内网IP功能。商家VPS主机均2GB内存起步,三个地区机房可选,使用优惠码后每月69元起;独立服务器开设在香港沙田电信机房,CN2线路,自动化开通上架,最低499元/月起。下面以...

无法定位程序输入点于动态链接库上为你推荐
免费制作空间免费做QQ空间!!!怎么搞免费qq空间明星论坛www.51.com是一个关于什么的网站?行业关键词企业应如何做关键词排名天府热线劲舞团 四川 天府热线 在哪改密码?选择大区怎么没天府?iphone5解锁捡了个苹果5怎么解锁中国电信互联星空电信的互联星空服务是什么?快速美白好方法快速美白的好点子!?(不是晒黑的)http与https的区别http和https到底有什么区别啊???网站联盟网盟跟b2b平台有什么区别保护气球什么气球可以骑?
过期域名 新网域名管理 香港ufo 132邮箱 themeforest cdn服务器 googleapps 免费ftp空间 12u机柜尺寸 轻博 建站代码 admit的用法 hkg 91vps 服务器是干什么的 免费智能解析 免费dns解析 卡巴斯基免费试用版 根服务器 中国联通宽带测试 更多