将静态库塞到动态库中

目的: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所以实现不了,静态库塞到动态库里面
 

猜你喜欢

转载自blog.csdn.net/qq_16810885/article/details/94036214