一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Linux|Centos|Ubuntu|系統(tǒng)進程|Fedora|注冊表|Bios|Solaris|Windows7|Windows10|Windows11|windows server|

服務器之家 - 服務器系統(tǒng) - Linux - 詳解Linux動態(tài)庫生成與使用指南

詳解Linux動態(tài)庫生成與使用指南

2020-07-23 11:40JollyWing Linux

這篇文章主要介紹了詳解Linux動態(tài)庫生成與使用指南,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

Linux動態(tài)庫文件的文件名形如 libxxx.so,其中so是 Shared Object 的縮寫,即可以共享的目標文件。

在鏈接動態(tài)庫生成可執(zhí)行文件時,并不會把動態(tài)庫的代碼復制到執(zhí)行文件中,而是在執(zhí)行文件中記錄對動態(tài)庫的引用。

程序執(zhí)行時,再去加載動態(tài)庫文件。如果動態(tài)庫已經(jīng)加載,則不必重復加載,從而能節(jié)省內存空間。

Linux下生成和使用動態(tài)庫的步驟如下:

  • 編寫源文件。
  • 將一個或幾個源文件編譯鏈接,生成共享庫。
  • 通過 -L<path> -lxxx 的gcc選項鏈接生成的libxxx.so。
  • 把libxxx.so放入鏈接庫的標準路徑,或指定 LD_LIBRARY_PATH,才能運行鏈接了libxxx.so的程序。

下面通過實例詳細講解。

編寫源文件

建立一個源文件: max.c,代碼如下:

?
1
2
3
4
5
6
7
int max(int n1, int n2, int n3)
{
  int max_num = n1;
  max_num = max_num < n2? n2: max_num;
  max_num = max_num < n3? n3: max_num;
  return max_num;
}

編譯生成共享庫:

?
1
gcc -fPIC -shared -o libmax.so max.c

我們會得到libmax.so。

實際上上述過程分為編譯和鏈接兩步, -fPIC是編譯選項,PIC是 Position Independent Code 的縮寫,表示要生成位置無關的代碼,這是動態(tài)庫需要的特性; -shared是鏈接選項,告訴gcc生成動態(tài)庫而不是可執(zhí)行文件。

上述的一行命令等同于:

?
1
2
gcc -c -fPIC max.c
gcc -shared -o libmax.so max.o

為動態(tài)庫編寫接口文件

為了讓用戶知道我們的動態(tài)庫中有哪些接口可用,我們需要編寫對應的頭文件。

建立 max.h ,輸入以下代碼:

?
1
2
3
4
5
6
#ifndef __MAX_H__
#define __MAX_H__
 
int max(int n1, int n2, int n3);
 
#endif

測試,鏈接動態(tài)庫生成可執(zhí)行文件

建立一個使用max函數(shù)的test.c,代碼如下:

?
1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include "max.h"
 
int main(int argc, char *argv[])
{
  int a = 10, b = -2, c = 100;
  printf("max among 10, -2 and 100 is %d.\n", max(a, b, c));
  return 0;
}

gcc test.c -L. -lmax 生成a.out,其中-lmax表示要鏈接libmax.so。

-L.表示搜索要鏈接的庫文件時包含當前路徑。

注意,如果同一目錄下同時存在同名的動態(tài)庫和靜態(tài)庫,比如 libmax.so 和 libmax.a 都在當前路徑下,
則gcc會優(yōu)先鏈接動態(tài)庫。

運行

運行 ./a.out 會得到以下的錯誤提示。

./a.out: error while loading shared libraries: libmax.so: cannot open shared object file: No such file or directory

找不到libmax.so,原來Linux是通過 /etc/ld.so.cache 文件搜尋要鏈接的動態(tài)庫的。
而 /etc/ld.so.cache 是 ldconfig 程序讀取 /etc/ld.so.conf 文件生成的。
(注意, /etc/ld.so.conf 中并不必包含 /lib 和 /usr/lib,ldconfig程序會自動搜索這兩個目錄)

如果我們把 libmax.so 所在的路徑添加到 /etc/ld.so.conf 中,再以root權限運行 ldconfig 程序,更新 /etc/ld.so.cache ,a.out運行時,就可以找到 libmax.so。

但作為一個簡單的測試例子,讓我們改動系統(tǒng)的東西,似乎不太合適。

還有另一種簡單的方法,就是為a.out指定 LD_LIBRARY_PATH。

?
1
LD_LIBRARY_PATH=. ./a.out

程序就能正常運行了。LD_LIBRARY_PATH=. 是告訴 a.out,先在當前路徑尋找鏈接的動態(tài)庫。

對于elf格式的可執(zhí)行程序,是由ld-linux.so*來完成的,它先后搜索elf文件的 DT_RPATH 段, 環(huán)境變量 LD_LIBRARY_PATH, /etc/ld.so.cache文件列表, /lib/,/usr/lib目錄, 找到庫文件后將其載入內存.

makefile讓工作自動化

編寫makefile,內容如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
.PHONY: build test clean
 
build: libmax.so
 
libmax.so: max.o
 gcc -o $@ -shared $<
 
max.o: max.c
 gcc -c -fPIC $<
 
test: a.out
 
a.out: test.c libmax.so
 gcc test.c -L. -lmax
 LD_LIBRARY_PATH=. ./a.out
 
clean:
 rm -f *.o *.so a.out

make build就會生成libmax.so, make test就會生成a.out并執(zhí)行,make clean會清理編譯和測試結果。

到此這篇關于詳解Linux動態(tài)庫生成與使用指南的文章就介紹到這了,更多相關Linux動態(tài)庫生成內容請搜索服務器之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://www.cnblogs.com/jiqingwu/p/linux_dynamic_lib_create.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 色人阁图片 | 国产成人一区二区三区影院免费 | 精品福利一区二区免费视频 | 国产成人手机在线 | 欧美特级特黄a大片免费 | 4hc44四虎www在线影院男同 | 九九九九在线视频播放 | 波多野结衣作品在线观看 | 国产亚洲人成网站在线观看不卡 | 亚洲精品AV无码喷奶水糖心 | 蜜桃免费 | 午夜大片在线观看 | vod国产成人精品视频 | 日本在线精品视频 | 538免费精品视频搬运工 | 国产亚洲精品一区二区在线观看 | 国产老妇 | 日本不卡1卡2卡三卡网站二百 | 久久99精国产一区二区三区四区 | 调教开发新婚娇妻放荡 | 国产精品一久久香蕉产线看 | 香港三级浴室女警官 | 袖珍人与大黑人性视频 | 欧美在线视频免费播放 | 国产精品林美惠子在线观看 | 麻豆视频网 | 阿 好深 快点 老师受不了 | 欧美免赞性视频 | 日本在线看 | 国产99区 | 99国产精品免费观看视频 | 九九精品成人免费国产片 | 俄罗斯美女破苞 | 久久精品中文闷骚内射 | 国产大片51精品免费观看 | 欧美日韩精品一区二区三区视频 | 国产东北3p真实在线456视频 | 国产免费一区不卡在线 | 四虎影院新地址 | 午夜精品久久久久久久2023 | 性春院|