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
總結
以上是生活随笔為你收集整理的linux下编译动态和静态链接库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LINUX网络状态工具SS命令使用详解
- 下一篇: IIS调用批处理权限的处理