来源自:
当编写自己的库,你需要知道你想支持什么格式.
blackfin支持几种不同类型的库:
FLAT static
FLAT shared
FDPIC ELF static
FDPIC ELF shared
下面就通过创建一个虚拟的libbar库,来说明这些类型的库是如何创建和使用的。
这个库有以下特性:
两个源文件:bar,c api.c
测试代码:test.c
这次之前,你应该对makefile有所了解,你可以到make页面去对makefile进行了解:
继续..
FLAT(static)
通过bfin-uclinux-ar工具链和创建。
- bfin-uclinux-gcc -c bar.c -o bar.o
- bfin-uclinux-gcc -c api.c -o api.o
- bfin-uclinux-ar rcu libbar.a bar.o api.o
然后创建应用程序去连接它,只需要使用 -lbar(如果库不在非标准的位置使用 -Lpath).
- bfin-uclinux-gcc test.c -o test -L. -lbar -Wl,-elf2flt
这种格式的Makefile是:
- ROSS = bfin-uclinux-
- AR = $(CROSS)ar
- CC = $(CROSS)gcc
- RANLIB = $(CROSS)ranlib
- CFLAGS += -Wall
- LDFLAGS_test = $(LDFLAGS) -Wl,-elf2flt
- LDLIBS_test = $(LDLIBS) -L. -lbar
- LIBS = libbar.a
- BINS = test
- all: $(LIBS) $(BINS)
- libbar.a: bar.o api.o
- $(AR) rcu $@ $^
- $(RANLIB) $@
- test: test.o
- $(CC) $(CFLAGS) -o $@ $^ $(LDLIBS_$@) $(LDFLAGS_$@)
- clean:
- rm -f *.o *.gdb $(BINS) $(LIBS)
- .PHONY: all clean
注意调用bfin-uClinux-ranlib并不是必需的,因为它仅仅是创建一个索引,以帮助加快连接过程。
然后Make :)
- $ make
- bfin-uclinux-gcc -Wall -c -o bar.o bar.c
- bfin-uclinux-gcc -Wall -c -o api.o api.c
- bfin-uclinux-ar rcu libbar.a bar.o api.o
- bfin-uclinux-ranlib libbar.a
- bfin-uclinux-gcc -Wall -c -o test.o test.c
- bfin-uclinux-gcc -Wall -o test test.o -L. -lbar -Wl,-elf2flt
FLAG(shared) 略过
FDPIC ELF(static)
编译一个FDPIC ELF静态库和FLAT静态库一样简单,只需要更改不同的工具链即可。
- bfin-linux-uclibc-gcc -c bar.c -o bar.o
- bfin-linux-uclibc-gcc -c api.c -o api.o
- bfin-linux-uclibc-ar rcu libbar.a bar.o api.o
链接
- bfin-linux-uclibc-gcc test.c -o test -L. -lbar
对应的makefile:
- CROSS = bfin-linux-uclibc-
- AR = $(CROSS)ar
- CC = $(CROSS)gcc
- RANLIB = $(CROSS)ranlib
- CFLAGS += -Wall
- LDLIBS_test = $(LDLIBS) -L. -lbar
- LIBS = libbar.a
- BINS = test
- all: $(LIBS) $(BINS)
- libbar.a: bar.o api.o
- $(AR) rcu $@ $^
- $(RANLIB) $@
- test: test.o
- $(CC) $(CFLAGS) -o $@ $^ $(LDLIBS_$@) $(LDFLAGS_$@)
- clean:
- rm -f *.o $(BINS) $(LIBS)
- .PHONY: all clean
运行这个makefile
- $ make
- bfin-linux-uclibc-gcc -Wall -c -o bar.o bar.c
- bfin-linux-uclibc-gcc -Wall -c -o api.o api.c
- bfin-linux-uclibc-ar rcu libbar.a bar.o api.o
- bfin-linux-uclibc-ranlib libbar.a
- bfin-linux-uclibc-gcc -Wall -c -o test.o test.c
- bfin-linux-uclibc-gcc -Wall -o test test.o -L. -lbar
FDPIC ELF(shared)
FDPIC ELF共享库的创建要比FLAT共享库简单的多。
对于这种格式.我们需要使用标记: -shared -Wl,-soname,libbar.so
- bfin-linux-uclibc-gcc -c bar.c -o bar.o
- bfin-linux-uclibc-gcc -c api.c -o api.o
- bfin-linux-uclibc-gcc -shared -Wl,-soname,libbar.so -o libbar.so bar.o api.o
链接这个库:
- bfin-linux-uclibc-gcc test.c -o test -L. -lbar
对应的Makefile文件:
- CROSS = bfin-linux-uclibc-
- CC = $(CROSS)gcc
- CFLAGS += -Wall
- LDFLAGS_libbar.so = -shared -Wl,-soname,libbar.so
- LDLIBS_test = $(LDLIBS) -L. -lbar
- LIBS = libbar.so
- BINS = test
- all: $(LIBS) $(BINS)
- libbar.so: bar.o api.o
- $(CC) $(CFLAGS) -o $@ $^ $(LDLIBS_$@) $(LDFLAGS_$@)
- test: test.o
- $(CC) $(CFLAGS) -o $@ $^ $(LDLIBS_$@) $(LDFLAGS_$@)
- clean:
- rm -f *.o $(BINS) $(LIBS)
- .PHONY: all clean
运行这个Makefile:
- $ make
- bfin-linux-uclibc-gcc -Wall -c -o bar.o bar.c
- bfin-linux-uclibc-gcc -Wall -c -o api.o api.c
- bfin-linux-uclibc-gcc -Wall -o libbar.so bar.o api.o -shared -Wl,-soname,libbar.so
- bfin-linux-uclibc-gcc -Wall -c -o test.o test.c
- 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) |