日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux下编译动态和静态链接库

發布時間:2025/7/14 linux 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux下编译动态和静态链接库 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

靜態庫在程序編譯時會被連接到目標代碼中,程序運行時將不再需要該靜態庫。

動態庫在程序編譯時并不會被連接到目標代碼中,而是在程序運行是才被載入,因此在程序運行時還需要動態庫存在。

查看當前工程目錄的內容

[root@root config-file]# tree?

.

|-- Makefile

|-- Makefile.a

|-- Makefile.so

|-- configfile.c

|-- configfile.o

|-- include

| ? |-- configfile.h

| ? `-- our_syslog.h

|-- main.c

`-- main.o

1 directory, 9 files

[root@root config-file]# cat include/*.h

++++++++++++++++++++++++++++++++++++++++++++

int read_config_file(char *filename, char *keyword, char *value);

#define dmsg(log,format,args...) do{if(log) \

? ? fprintf(stderr, "WARING: " format , ##args); ? ?\

? ? else ? ?\

? ? fprintf(stderr, "INFO: " format , ##args); ?\

? ? }while(0)

++++++++++++++++++++++++++++++++++++++++++++

Makefile.so生成動態鏈接庫的makefile文件

[root@root config-file]# cat ?Makefile.so?

CFLAGS += -I/root/config-file/include -fPIC

DFLAGS += $(CFLAGS) -shared


all : libfile.so


libfile.so: configfile.o

$(CC) $^ -o $@ $(DFLAGS)

%.o:%.c

$(CC)?$(CFLAGS) -c $< -o $@


.PHONY : clean

clean :

-rm -f libfile.so *.o

Makefile.a生成靜態鏈接庫的makefile文件

[root@root config-file]# cat ?Makefile.a

CFLAGS += -I/root/config-file/include


all : libfile.a


libfile.a: configfile.o

? ??$(AR)?rcs $@ $^

%.o:%.c

? ??$(CC)?$(CFLAGS) -c $< -o $@


.PHONY : clean

clean :

? ? -rm -f libfile.a *.o

主程序

[root@root config-file]# cat ?main.c?

#include <stdio.h>

#include <stdlib.h>

#include "configfile.h"

#include "our_syslog.h"


int ?main()

{

? ? char value[100]={0};

? ? read_config_file("/root/syslog.conf", "openwrt", value);

? ? dmsg(0,"%s\n", value);

? ? dmsg(1,"%s\n", value);

? ? return 0;

}

主程序的Makefile

[root@root config-file]# cat ?Makefile

OBJS=configfile.o main.o


CFLAGS=-I/root/config-file/include

CFLIBS=-L/root/config-file -lfile -g -O -Wall


all:test


test: $(OBJS)

? ??$(CC)?$^ -o $@ $(CFLAGS) $(CFLIBS)

%.o:%.c

? ??$(CC)?-c $< -o $@ $(CFLAGS)


.PHONY : clean

clean :

? ? -rm -f test *.o

生產靜態庫

[root@root config-file]# make -f Makefile.a

gcc -I/root/config-file/include -c configfile.c -o configfile.o

ar rcs libfile.a configfile.o

[root@root config-file]# ar -t libfile.a #查看靜態庫中的文件

configfile.o

連接靜態庫,編譯主程序

[root@root config-file]# make

gcc -c configfile.c -o configfile.o -I/root/config-file/include

gcc -c main.c -o main.o -I/root/config-file/include

gcc configfile.o main.o -o test -I/root/config-file/include -L/root/config-file -lfile -g -O -Wall

[root@root config-file]# ./test?

INFO: hello-openwrt

WARING: hello-openwrt

[root@root config-file]# rm libfile.a?

rm:是否刪除 一般文件 “libfile.a”? y

生產動態庫

[root@root config-file]# make -f Makefile.so?

gcc -I/root/config-file/include -fPIC -c configfile.c -o configfile.o

gcc configfile.o -o libfile.so -I/root/config-file/include -fPIC -shared

[root@root config-file]# ls

configfile.c ?configfile.o ?include ?libfile.so ?main.c ?Makefile ?Makefile.a ?Makefile.so

連接動態庫,編譯主程序

[root@root config-file]# make

gcc -c configfile.c -o configfile.o -I/root/config-file/include

gcc -c main.c -o main.o -I/root/config-file/include

gcc configfile.o main.o -o test -I/root/config-file/include -L/root/config-file -lfile -g -O -Wall

[root@root config-file]# ./test?

./test: error while loading shared libraries: libfile.so: cannot open shared object file: No such file or directory

這就是動態庫和靜態庫的區別了

[root@root config-file]# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/root/config-file

也可以放到/usr/lib下(64位系統/usr/lib64)

[root@root config-file]# ./test?

INFO: hello-openwrt

WARING: hello-openwrt

使用ldd命令查看可執行文件依賴于哪些庫

[root@root config-file]# ldd test?

linux-gate.so.1 => ?(0x00782000)

libfile.so (0x007ae000)

libc.so.6 => /lib/libc.so.6 (0x007f4000)

/lib/ld-linux.so.2 (0x007d1000)



本文轉自 Linux_woniu 51CTO博客,原文鏈接:http://blog.51cto.com/linuxcgi/1965301

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的linux下编译动态和静态链接库的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。