10月15日笔记交叉开发库

所有的事情都是有可能的 只要给我一个中间件(库)


    库 是一种代码的二进制封装形式
    为了实现代码的复用 以及方便开发
    动态库 libXXX.so(xxx是库的名字,lib是前缀.so是后缀)
    静态库 libxxx.a

1.动态库
    1.编辑动态库源码
        包含 .c和.h  每一个.c对应一个.h

        不会有main函数

    2.生成动态库
    (arm-linux-)gcc -shared -fpic 文件列表 -o libxxx.so
            xxx是库的名字
            -shared 动态库
            -fpic 与位置无关
    3.怎么使用 把动态库和对应的.h拷贝给别人

                cp
    4.怎么编译
        (arm-linux-)gcc main.c  -I./ -L./ -lhello
        -I 指定头文件搜索路径
        -L 指定库的搜索路径
        -l 库的名字 不带lib 和.so .a
    

报错:

    ./a.out: error while loading shared libraries: libhello.so:
     cannot open shared object file: No such file or directory
     打开库失败的原因 找不到动态库文件

     执行的时候,依然要知道动态库哪里 
     执行的时候是通过环境变量去查找动态库的
            LD_LIBRARY_PATH
    有两种方式
        1.执行一下命令将程序的动态库添加到搜索路径

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:你动态库的所在的绝对路径

       
        重启终端后无效  除非去修改配置文件
        2.将动态库放到系统库的路径下面去 比如/usr/lib   不推荐

    如果是交叉开发 需要把动态库下载到开发板下面  然后设置环境变量
    因为程序里面没有动态库的代码,运行时才会去找动态库


静态库
    静态库也是一种库 是代码的二进制封装
    动态库有什么区别,静态库在使用的时候,会把静态库中的内容编译到可执行文件中去
    缺点是会导致可执行程序变大,占内存。运行的时候不需要动态库

    编译静态库的时候需要先生成对应.o文件,才能生成静态库
    1.生成目标文件 如果有多个文件就要多次生成
        (arm-linux-)gcc -c hello.c -o hello.o
        (arm-linux-)gcc -c 文件2.c -o 文件2.o
    2.生成静态库
        (arm-linux-)ar -rc libhello.a hello.o 文件2.o

        再按照动态库的来编译

        (arm-linux-)gcc main.c  -I./ -L./ -lhello

    NOTE
        1.在利用库进行编译程序的时候,如果搜索路径下既有动态库
            又有静态库,则优先使用动态库
            如果想要优先使用静态库 加上-static选项

                (arm-linux-)gcc main.c  -I./ -L./ -lhello -static
        2.如果是用静态库编译的程序,则下载程序的时候只需要下载程序就好了
            不需要下载静态库
        3.如果是用动态库编译的程序,则下载程序的时候既需要下载程序
            也需要下载动态库,并设置环境变量等操作
            使用动态库编译的程序,需要在运行时去动态库找资源
        4.如果是交叉开,无论是库的生成还是中间文件编译,程序的编译
            都需要使用交叉编译指令
         



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值