Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16985
  • 博文数量: 4
  • 博客积分: 70
  • 博客等级: 民兵
  • 技术积分: 35
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-14 11:47
文章分类
文章存档

2011年(4)

我的朋友

分类: LINUX

2011-12-30 11:27:03

来源自:
 
当编写自己的库,你需要知道你想支持什么格式.
blackfin支持几种不同类型的库:
FLAT static
FLAT shared
FDPIC ELF static
FDPIC ELF shared
FLAT 和 FDPC格式是不兼容的,因此你的应用程序只能使用其中一格式的库。
如果你不确定你要使用那种格式,访问:executable file formats
http://docs.blackfin.uclinux.org/doku.php?id=toolchain:executable_file_formats
 
下面就通过创建一个虚拟的libbar库,来说明这些类型的库是如何创建和使用的。
这个库有以下特性:
两个源文件:bar,c  api.c
测试代码:test.c
 
这次之前,你应该对makefile有所了解,你可以到make页面去对makefile进行了解:
 
继续..
 
FLAT(static)
通过bfin-uclinux-ar工具链和创建。
  1. bfin-uclinux-gcc -c bar.c -o bar.o
  2. bfin-uclinux-gcc -c api.c -o api.o
  3. bfin-uclinux-ar rcu libbar.a bar.o api.o
然后创建应用程序去连接它,只需要使用 -lbar(如果库不在非标准的位置使用 -Lpath).

  1. bfin-uclinux-gcc test.c -o test -L. -lbar -Wl,-elf2flt
 
这种格式的Makefile是:
  1. ROSS = bfin-uclinux-
  2. AR = $(CROSS)ar
  3. CC = $(CROSS)gcc
  4. RANLIB = $(CROSS)ranlib

  5. CFLAGS += -Wall
  6. LDFLAGS_test = $(LDFLAGS) -Wl,-elf2flt
  7. LDLIBS_test = $(LDLIBS) -L. -lbar

  8. LIBS = libbar.a
  9. BINS = test

  10. all: $(LIBS) $(BINS)

  11. libbar.a: bar.o api.o
  12.     $(AR) rcu $@ $^
  13.     $(RANLIB) $@

  14. test: test.o
  15.     $(CC) $(CFLAGS) -o $@ $^ $(LDLIBS_$@) $(LDFLAGS_$@)

  16. clean:
  17.     rm -f *.o *.gdb $(BINS) $(LIBS)

  18. .PHONY: all clean
注意调用bfin-uClinux-ranlib并不是必需的,因为它仅仅是创建一个索引,以帮助加快连接过程。
然后Make    :)
  1. $ make
  2. bfin-uclinux-gcc -Wall -c -o bar.o bar.c
  3. bfin-uclinux-gcc -Wall -c -o api.o api.c
  4. bfin-uclinux-ar rcu libbar.a bar.o api.o
  5. bfin-uclinux-ranlib libbar.a
  6. bfin-uclinux-gcc -Wall -c -o test.o test.c
  7. bfin-uclinux-gcc -Wall -o test test.o -L. -lbar -Wl,-elf2flt
 
FLAG(shared) 略过
 
 
FDPIC ELF(static)
编译一个FDPIC ELF静态库和FLAT静态库一样简单,只需要更改不同的工具链即可。
  1. bfin-linux-uclibc-gcc -c bar.c -o bar.o
  2. bfin-linux-uclibc-gcc -c api.c -o api.o
  3. bfin-linux-uclibc-ar rcu libbar.a bar.o api.o

链接
  1. bfin-linux-uclibc-gcc test.c -o test -L. -lbar
 
对应的makefile:

  1. CROSS = bfin-linux-uclibc-
  2. AR = $(CROSS)ar
  3. CC = $(CROSS)gcc
  4. RANLIB = $(CROSS)ranlib

  5. CFLAGS += -Wall
  6. LDLIBS_test = $(LDLIBS) -L. -lbar

  7. LIBS = libbar.a
  8. BINS = test

  9. all: $(LIBS) $(BINS)

  10. libbar.a: bar.o api.o
  11.     $(AR) rcu $@ $^
  12.     $(RANLIB) $@

  13. test: test.o
  14.     $(CC) $(CFLAGS) -o $@ $^ $(LDLIBS_$@) $(LDFLAGS_$@)

  15. clean:
  16.     rm -f *.o $(BINS) $(LIBS)

  17. .PHONY: all clean
 
运行这个makefile

  1. $ make
  2. bfin-linux-uclibc-gcc -Wall -c -o bar.o bar.c
  3. bfin-linux-uclibc-gcc -Wall -c -o api.o api.c
  4. bfin-linux-uclibc-ar rcu libbar.a bar.o api.o
  5. bfin-linux-uclibc-ranlib libbar.a
  6. bfin-linux-uclibc-gcc -Wall -c -o test.o test.c
  7. bfin-linux-uclibc-gcc -Wall -o test test.o -L. -lbar
FDPIC ELF(shared)
FDPIC ELF共享库的创建要比FLAT共享库简单的多。
对于这种格式.我们需要使用标记: -shared -Wl,-soname,libbar.so

  1. bfin-linux-uclibc-gcc -c bar.c -o bar.o
  2. bfin-linux-uclibc-gcc -c api.c -o api.o
  3. bfin-linux-uclibc-gcc -shared -Wl,-soname,libbar.so -o libbar.so bar.o api.o
 
链接这个库:
  1. bfin-linux-uclibc-gcc test.c -o test -L. -lbar
 
对应的Makefile文件:
  1. CROSS = bfin-linux-uclibc-
  2. CC = $(CROSS)gcc

  3. CFLAGS += -Wall
  4. LDFLAGS_libbar.so = -shared -Wl,-soname,libbar.so
  5. LDLIBS_test = $(LDLIBS) -L. -lbar

  6. LIBS = libbar.so
  7. BINS = test

  8. all: $(LIBS) $(BINS)

  9. libbar.so: bar.o api.o
  10.     $(CC) $(CFLAGS) -o $@ $^ $(LDLIBS_$@) $(LDFLAGS_$@)

  11. test: test.o
  12.     $(CC) $(CFLAGS) -o $@ $^ $(LDLIBS_$@) $(LDFLAGS_$@)

  13. clean:
  14.     rm -f *.o $(BINS) $(LIBS)

  15. .PHONY: all clean
 
运行这个Makefile:
  1. $ make
  2. bfin-linux-uclibc-gcc -Wall -c -o bar.o bar.c
  3. bfin-linux-uclibc-gcc -Wall -c -o api.o api.c
  4. bfin-linux-uclibc-gcc -Wall -o libbar.so bar.o api.o -shared -Wl,-soname,libbar.so
  5. bfin-linux-uclibc-gcc -Wall -c -o test.o test.c
  6. bfin-linux-uclibc-gcc -Wall -o test test.o -L. -lbar
当你使用共享库时,你需要把libbar.so库文件和你的可执行程序放在一起,或者把
你的可执行文件放到/lib/目录统一关系..否则你的程序会抱怨你,它找不到它的库文件。
 
Summary
The things to keep in mind:
■build FLAT binaries with bfin-uclinux-gcc
■link FLAT binaries with -Wl,-elf2flt
■build FDPIC ELF objects with bfin-linux-uclibc-gcc
■link FDPIC ELF shared libraries with -shared
■dynamic libraries must be copied to the board
■shared FLAT libraries requires you to allocate the unique IDs 
阅读(1896) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~