Linux下动态链接库的使用

在学习APUE时,使用gcc 1-5.c -o 1-5生成可执行文件时,出现如下错误:

1-5.c:(.text+0x75): undefined reference to `err_sys'
1-5.c:(.text+0xb9): undefined reference to `err_ret'
1-5.c:(.text+0xf4): undefined reference to `err_sys'
collect2: ld returned 1 exit status

这是因为未找到以上三个函数的定义,此时,我们可以找到含有以上函数定义的源文件,生成动态链接库,然后生成1-5时,链接到动态链接库即可。

以上函数在文件error.c中定义,所以,可使用以下命令生成动态链接库文件。

gcc -shared -fPIC error.c -o liberror.so

-share说明生成动态链接库,-fPIC表示生成位置无关代码,同时注意生成的动态链接库的名称格式

此时,再生成1-5可执行文件可使用如下命令:

gcc 1-5.c -o 1-5 -L. -lerror

-L.表示链接依赖库的搜索路径包括当前文件,-lerror表示所要使用的动态链接库

之后,如果执行生成的文件./1-5如出现错误

./1-5: error while loading shared libraries: liberror.so: cannot open shared object file: No such file or directory

即,找不到文件liberror.so,这是为什么呢?因为程序1-5在执行时使用到了动态链接库,此时系统就要到某些目录中找,那么,系统是到哪些目录中找呢?

通过网上搜寻,发现运行时动态链接库的搜索路径和ldconfig命令还有LD_LIBRARY_PATH环境变量有关,查找ldconfig命令的手册,找到如下说明

ldconfig creates the necessary links and cache to  the  most  recent  shared libraries  found  in  the  directories specified on the command line, in the file /etc/ld.so.conf, and in the trusted directories  (/lib  and  /usr/lib).

-v     
    Verbose  mode.  Print current version number, the name of each direc-tory as it is scanned, and any links  that  are  created.   Overrides quiet mode.

FILES
   /lib/ld.so          run-time linker/loader
   /etc/ld.so.conf     File containing a list of colon, space, tab, newline, or
                       comma-separated  directories  in  which  to  search  for
                       libraries.
   /etc/ld.so.cache    File  containing  an  ordered list of libraries found in
                       the directories specified in /etc/ld.so.conf, as well as
                       those found in /lib and /usr/lib.

由上可知,/etc/ld.so.conf包括了搜寻所要使用到的目录,-v选项可以列出扫描的目录,使用ldconfig -v | grep ^/得到以下输出

/usr/lib64/atlas:
/usr/lib64/mysql:
/usr/lib64/qt-3.3/lib:
/usr/lib64/xulrunner:
/lib:
/lib64:
/usr/lib:
/usr/lib64:
/lib64/tls: (hwcap: 0x8000000000000000)
/usr/lib64/tls: (hwcap: 0x8000000000000000)
/usr/lib64/sse2: (hwcap: 0x0000000004000000)

现在我们可以知道ldconfig的搜寻目录有哪些了。

我们可以将自己所生成的库所在路径添加到/etc/ld.so.conf文件中,再执行ldconfig,之后,系统就可以找到自己所生成的库文件了。

另外,如果查阅man ld.so文档,发现如下信息

 LD_LIBRARY_PATH
          A  colon-separated  list  of  directories  in which to search for ELF
          libraries at execution-time.  Similar to the PATH  environment  vari-
          able.

环境变量 LD_LIBRARY_PATH保存着执行时所依赖库的搜寻路径,所以,可以使用第二种方法来让系统找到自定义的动态链接库了。命令如下:

export LD_LIBRARY_PATH="where you library locates?"

One more thing

在生成可执行文件时,我们使用gcc 1-5.c -o 1-5 -L. -lerror,其中-L.我们指明了依赖库的搜索路径,如果没有这个参数,那是否有系统默认的呢?
答案是有的。系统有默认的依赖库的搜索路径,但是这个搜索路径是链接时依赖库的搜索路径,和上面所提到的运行时依赖库的搜索路径是不一样的。
那么默认的链接时的搜索路径是哪些呢?
网上找到了一些答案,担是我未找到官方文档中的一些说明 ,暂记录如下:

  • 编译的时候:gcc会去找-L
  • 再找gcc的环境变量LIBRARY_PATH
  • 再找内定目录 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的

通过将liberror.so文件拷贝到/usr/lib/目录下,然后使用gcc 1-5.c -o 1-5 -lerror执行成功可说明,/usr/lib/确实是默认目录之一。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容