目的:libimp.a libalog.a 和 业务源码 一起打包成libaudioplug.so里面去。
总结:要想将libimp.a libalog.a文件打包到ibaudioplug.so里面去,必须在编译libimp.a libalog.a的时候和编译业务源码的时候,都
使用-fPIC,才能将3个合二为一。
要实现就使用动态库libimp.so libalog.so,就可以了,连接就完事了,运行时,就需要libaudioplug.so libimp.so libalog.so 三个库。
------------------------------------------------------------------后面是实验过程-------------------------------------------------------------------------
1)
JZ_STATIC_LIBS := $(JZ_SDK_PATH)/lib/uclibc/libimp.a $(JZ_SDK_PATH)/lib/uclibc/libalog.a
lib:$(PLUG_SRC)
mips-linux-uclibc-gnu-g++ -fPIC -shared $^ $(JZ_STATIC_LIBS) $(INC_PATH) -o libaudioplug.so
报错:
/home/yp/toolchains/T20_toolchain/mips-gcc472-glibc216-32bit/bin/../lib/gcc/mips-linux-gnu/4.7.2/../../../../mips-linux-gnu/bin/ld: ./jz_lib/MergeBaseMove.c.o:
relocation R_MIPS_HI16 against `a local symbol' can not be used when making a shared object; recompile with -fPIC
./jz_lib/MergeBaseMove.c.o: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
Makefile:32: recipe for target 'lib' failed
make: *** [lib] Error 1
2)
那么我使用ar 将静态库接成.o文件,再试一下
JZ_LIB_OBJ := ./jz_lib/*.o
JZ_STATIC_LIBS := $(JZ_SDK_PATH)/lib/uclibc/libimp.a $(JZ_SDK_PATH)/lib/uclibc/libalog.a
lib:$(PLUG_SRC)
mips-linux-uclibc-gnu-g++ -fPIC -shared $^ $(JZ_LIB_OBJ) $(INC_PATH) -o libaudioplug.so
报同样的错。
3)
我又试了一下
lib:$(PLUG_SRC)
mips-linux-uclibc-gnu-g++ -fPIC -shared $(JZ_LIB_OBJ) $^ $(INC_PATH) -o libaudioplug.so
报同样的错。
4)
我又又试了一下
lib:$(PLUG_SRC)
mips-linux-uclibc-gnu-g++ -fPIC -shared $(JZ_STATIC_LIBS) $^ $(INC_PATH) -o libaudioplug.so
编译过了,然后,我就开始使用这个动态库了,结果只要调用这个JZ_STATIC_LIBS的函数就段错误。
5)
我又又又试了一下,我都不加这个静态库,编译也过了。跑程序还是段错误
lib:$(PLUG_SRC)
mips-linux-uclibc-gnu-g++ -fPIC -shared $^ $(INC_PATH) -o libaudioplug.so
6)
我又又又又试了一下,我都不加这个静态库,在使用的时候,将静态库加上,编译又又过了。跑程序还是又又段错误。
lib:$(PLUG_SRC)
mips-linux-uclibc-gnu-g++ -fPIC -shared $^ $(INC_PATH) -o libaudioplug.so
7)我又又又又又试了一下,将原来的静态库换成使用动态库, 编译过了,测试程序也过了。圆满了。
lib:$(PLUG_SRC)
mips-linux-uclibc-gnu-g++ -fPIC -shared $^ -limp -lalog $(LIB_PATH) $(INC_PATH) -o libaudioplug.so
看来他娘的把静态库搞到动态库里,很难啊。
总结:这里面有一个编译顺序问题,有一个是编译选项问题。
编译顺序问题呢,我不想探究,其实静态库之间的调用是有个顺序问题。
编译选项问题就是-fPIC,这个选项要所有的.o生成的时候都要加上,那么就可以把静态库塞到动态库中。
因为君正的库没有使用-fPIC所以实现不了,静态库塞到动态库里面