LINUX下移植libjpeg库过程

1、移植(源码下载、解压、配置、修改Makefile、编译或交叉编译 )

1.1 找到并分析、配置运行脚本文件

    (1)一般linux下移植的库,第一步都是配置,之后才能编译,解压后一般都能找类似config脚本文件,配置就是运行这个脚本。比如libjpeg库运行脚本时,它会提示你运行时添加参数去配置 ./config --XXX等等。

  (2)  ./configure --prefix=/opt/libdecode --exec-prefix=/opt/libdecode --enable-shared --enable-static -build=i386 -host=arm

        解释:为什么是这样的,谁开始都没有经验,百度去,运行配置这些参数后,最后生成的有用的东西就会存放在指定的这些前缀(prifix)文件夹下,所有配置之前你要保证这些文件是存在的,自己事先创建好的

    (3)对于libjpeg这个库,里面有很多生成makefile的原材料,执行上面脚本时会生成makefile


1.2 检查、修改、编译Makefile

    (1)检查:vi打开,看是否有需要修改的地方,一般看CC=? ARCH=?,因为我们编译makefile,编译过程需要利用当前架构下已经编译工具链,一般为CC=gcc,默认使用windows下的gcc编译工具,而我们在linux下,要用我们自己安装的编译工具链比如arm-none-linux-gnueabi-gcc,为了程序的可移植性,很多项目中的makefile使用CC=arm-linux-gcc,所以,之前我们要在linux下建立符号链接

    (2)修改:CC=arm-linux-gcc    AR=arm-linux-ar rc等类似操作

    (3)编译:去make把库里面的C文件编译链接成我们需要的so、a、h文件,再去make install-lib后,就把需要的文件放到指定的位置(为什么要后面这一步,百度去)


1.3 部署

    1.3.1  部署动态链接库位置选择(运行时需要,部署在根文件系统中)

    (1)一般有三个位置可以考虑(linux系统在运行时,加载动态文件会默认在一些文件下寻找库,如果在任意指定的地方,需要导出到环境变量,才能寻找到动态库):

            第一个:/lib
            第二个:/usr/lib
            第三个:任意指定目录,比如在根目录的/opt/mylib, cp过来后,运行前编写使用脚本./xxx.sh,最后放在~/bashrc.sh

                export LD_LIBRARY_PATH=/opt/mylib:$ LD_LIBRARY_PATH

    1.3.2  部署的文件作用

(1)动态库是运行时环境需要的,编译程序时不需要。

(2)静态库是静态连接时才需要,动态链接时不需要。

(3)头文件.h是在编译程序时使用的,运行时不需要的。

总结:静态库和头文件这两个东西,是在编译链接过程中需要的;而动态库是在运行时需要的。


2、使用libjpeg

2.1 在自己APP项目指导编译链接的主makefile,包含库,这是使用一个移植库的第一步

    2.1.1  注意三个编译链接选项:-I  -l  -L

        (1)-I是编译选项(准确的是说是预处理选项CFLAGS或者CPPFLAGS中指定),用来指定预处理时查找头文件的范围的。

        (2)-l是链接选项(LDFLAGS中指定),用来指定链接额外的库(譬如我们用到了数学函数,就用-lm,链接器就会去链接libm.so;那么我们使用了libjpeg,对应的库名字就叫libjpeg.so,就需要用-ljpeg选项去链接)

        (3)-L是链接选项(LDFLAGS中指定),用来告诉链接器到哪个路径下面去找动态链接库。之前我们放的地方/opt/libdecode/lib

        总结:-l是告诉链接器要链接的动态库的名字,而-L是告诉链接器库的路径        

     2.1.2  修改makefile

        (1)链接器的链接参数设置     LDFLAGS  := -ljpeg -L/opt/libdecode/lib

        (2)顺便说一下,编译这个makefile时,用的交叉编译工具链也是我们自己移植的,并且建立了符号链接


猜你喜欢

转载自blog.csdn.net/qq_40334837/article/details/80019615