Chinaunix首页 | 论坛 | 博客
  • 博客访问: 359124
  • 博文数量: 57
  • 博客积分: 2299
  • 博客等级: 大尉
  • 技术积分: 1109
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-27 23:12
文章分类
文章存档

2011年(4)

2010年(53)

分类: 嵌入式

2010-03-10 00:25:06

   中午在开发板上实现了程序的动态连接,接着就去实验室了,晚上回来学习了如何添加属于自己的动态链接库,现将过程记录如下:
实验代码简单,结构如下:

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
下载: 下载
阅读(1925) | 评论(1) | 转发(2) |
给主人留下些什么吧!~~

chinaunix网友2010-08-14 10:20:59

说明一下,如果是busybox,需要动态编译,注意share选项