中午在开发板上实现了程序的动态连接,接着就去实验室了,晚上回来学习了如何添加属于自己的动态链接库,现将过程记录如下:
实验代码简单,结构如下:
libtest/ |-- Makefile |-- it.c |-- it.h `-- main.c
0 directories, 4 files
|
/*it.c*/ #include<stdio.h> void libprint(void) { printf("Test Lib!\n"); }
|
/*it.h*/ void libprint(void);
|
/*main.c*/ #include"it.h" int main() { libprint(); return 0; }
|
Makefile
LIBDIR = /usr/local/lib LIBSO = libit.so TAG = testlib CC = gcc all: main.o it.o $(CC) -o $(TAG) main.o -lit it.o:it.c it.h $(CC) -c it.c -o it.o $(CC) -shared -Wall -fPIC it.o -o $(LIBSO) @cp libit.so $(LIBDIR) main.o:main.c it.h $(CC) -o main.o -c main.c clean: @rm -vf *.o *.so $(LIBDIR)/$(LIBSO) $(TAG)
|
make以后我们看一下程序的链接库情况:
[root@localhost libtest]# ldd testlib linux-gate.so.1 => (0x00f8b000) libit.so => /usr/local/lib/libit.so (0x0030f000) libc.so.6 => /lib/libc.so.6 (0x0058b000) /lib/ld-linux.so.2 (0x0056d000)
|
可以看到动态库里面多了一个自己编译出来的库,但是现在程序还不能运行,它还不能寻找到动态库的路径,需要执行一下
#export LD_LIBRARY_PATH=/usr/local/lib
|
这样程序就可以运行了
[root@localhost libtest]# ./testlib Test Lib!
|
现在就这个过程说一下我的理解:
it.o:it.c it.h $(CC) -c it.c -o it.o $(CC) -shared -Wall -fPIC it.o -o $(LIBSO) @cp libit.so $(LIBDIR)
|
这两句的意思是先把it.c编译成目标机器指令文件*.o(中间过程如预处理、编译及优化掠过,实际是执行了的),然后$(CC) -shared -Wall -fPIC it.o -o $(LIBSO)把*.o生成动态连接库*.so,以便在程序运行时从lib库中load,-Wall -fPIC 这两个参数不明白是什么意思,网上也有人不要。
all: main.o it.o $(CC) -o $(TAG) main.o -lit
|
这句是最后的链接过程,其中
-lit 指的是程序自动从系统动态链接库中寻找需要的库文件,也可以通过-B "路径"来手动指定动态链接库的路径,但是无论是自动还是手动指定,除了系统默认的/lib /usr/lib两个库外,其它的lib都需要export一下,例如:我们自己的*.so文件放在了/usr/local/lib下,我们需要执行export LD_LIBRARY_PATH = /usr/local/lib,随后编译器才能找到自己编译的库文件!-lit就是指定了找哪一个库文件,例如-lit那么找的就是libit.so这个库,这个要弄清楚,不然就会有file not fond的错误!
静态库是这样编译的
$ gcc -c lt.c -o lt.o //编译 $ ar cqs liblt.a lt.o //制作静态库
$ gcc test.o liblt.a -o test //链接
|
源码
|
文件: |
libtest.tar.gz |
大小: |
0KB |
下载: |
下载 | |
阅读(2181) | 评论(1) | 转发(2) |