第四篇 Linux函数库和交叉编译简述

目录

一、Linux函数库

1、静态库(static library)

①特点

②命名规则

③静态库制作

 ④使用静态库

 2、动态库(共享库 share library)

①特点

②命名规则

③动态库制作

④动态库的使用

二、交叉编译概述

1、什么是交叉编译

2、为什么需要交叉编译

3、交叉编译工具链安装

附:samba共享服务搭建

        ①解压安装包       

        ②添加环境变量



一、Linux函数库

函数库:函数的集合,每个函数都具有独立的功能且能被外界调用(如:windows中.dll文件)(注:库中的函数不是以源代码形式存在,而是已经经过编译后的二进制文件,只有链接到程序中才可以执行)

  • Linux中函数库分为:

        ①静态库 ②动态库(也称共享库)

(注:静态和动态主要体现在应用程序使用库的角度--编译进应用程序or动态加载)

1、静态库(static library)

①特点

       在程序编译时,静态库需要完整地和程序一起进行编译,库中所有的内容都将整合到程序中,编译生成的文件较大。

②命名规则:

libname.a(name自定义

③静态库制作:

        a)将*.c编译生成*.o          gcc xxx.c -c -o yyy.o

        (-c选项表示编译生成对应的.o文件,不加-o默认命名为xxx.o) 

        b)ar工具制作静态库         ar rcs libname.a  *.o(所有制作库的原料.o)

        c) 头文件(调用库时没有包含对应头文件会出现警告,或编译报错)

/***************************
 * This is a static library *
****************************/

#ifndef _LIBNAME_H
#define _LIBNAME_H
int add( int , int);
int sub( int , int );
……
#endif

 ④使用静态库

        

▶ gcc app.c /…/…libname.a  -I /…/…libname.h  

(区别于第二种用法,这里是直接加上库的.a文件的绝对路径)

▶或:gcc app.c -lname -L /.../..libname.h

(注意:-l后是需指定库名name即可)

-l        指定gcc编译时要链接的库
-L        指定库的路径,不加则默认/usr/lib(usr/local/lib)下查找
-I        指定头文件的路径,不加则默认到/usr/include等目录下查找
(编译器的默认查找路径可通过修改环境变量去更换)

修改环境变量(来源百度,发布时间久2009)http://www.cppblog.com/bujiwu/archive/2009/01/25/72575.aspx

注:实际使用中,也可以将制作好的库(.a)以及对应头文件(.h)放在编译器默认的查找路径下。此外,在程序中包含头文件时,有以下两种写法:

    • #include <name.h>            (从编译器默认路径查找头文件)
    • #include "name.h"                   (从当前路径查找头文件)

 2、动态库(共享库 share library)

①特点

不同于静态库,动态库只在程序运行时才被加载,编译时仅对其做简单的引用,编译生成的文件只保留对其的指向,文件较小

②命名规则

libname.so.major.minor(major为主版本号,minor为次版本号)

③动态库制作

gcc -shared -fpic *.c -o libname.so.major.minior

④动态库的使用

gcc app.c -lname -L+动态库的路径 -I+头文件路径(编译时只是对动态库的简单引用)

不同于静态库,这里编译出来的可执行程序依旧不能直接运行,这是因为应用程序运行时,需要去动态加载动态库(默认到/usr/lib),编译时只是对动态库的简单引用。

直接运行报错如下:

解决方法一:拷贝动态库到/usr/lib下

解决方法二:修改配置文件

解决方法三:添加环境变量

export LD_LIBARAY_PAYH=“动态库的路径”

二、交叉编译概述

1、什么是交叉编译

        交叉编译:在一种平台架构(X86)上编译另一种平台架构(ARM)的可执行代码。嵌入式开发通常采用宿主机-目标主机的开发模式,也就是在PC机(X86)上完成代码的编写、编译,在开发板(ARM)上运行程序。( ※ 交叉调试类似)

2、为什么需要交叉编译

        简单地说就是因为相比于我们常用的PC机,开发板的资源较匮乏,而程序编译过程需要较多的CPU、内存和磁盘空间等资源,开发板不足以支持较大工程量的程序编译。(如:内核编译)

3、交叉编译工具链安装

官网下载:gcc-arm-none-eabi-9-2020-q2-update-x86_64-linux.tar

交叉编译工具链提取码:1234

附:samba共享服务搭建

        ①解压安装包       

tar -xvf gcc-arm-none-eabi-9-2020-q2-update-x86_64-linux.tar
附:Linux常见解压命令总结
压缩包类型解压命令
*.tartar -xvf
*.tar.gztar -xzvf
*.tar.bz2tar -xjvf
*.rarunrar e
*.zipunzip

        ②添加环境变量

        a)进到解压后文件夹中的/gcc-arm-none-eabi-9-2020-q2-update/bin目录,ls确认交叉编译工具的安装路径,复制/gcc-arm-none-eabi-9-2020-q2-update/bin

        b)添加环境变量                sudo vi /etc/environment

(在原有的双引号前输入后粘贴复制的路径)

        c)检查是否完成安装:TAB键能否补全arm-none-eabi-命令

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AF_INET6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值