目录
一、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
附:samba共享服务搭建
①解压安装包
tar -xvf gcc-arm-none-eabi-9-2020-q2-update-x86_64-linux.tar
压缩包类型 | 解压命令 |
---|---|
*.tar | tar -xvf |
*.tar.gz | tar -xzvf |
*.tar.bz2 | tar -xjvf |
*.rar | unrar e |
*.zip | unzip |
②添加环境变量
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-命令