您的位置:首页 > 其它

嵌入式每日学习心得2017.08.14

2017-08-14 23:04 218 查看
异常:程序或系统在运行期间遇到运行错误

  运行程序时,系统会将运行的执行权递交给程序,一当遇到异常,系统会回收此执行权(停止程序的运行,并报出错误)

异常:
软件异常:除数为0,内存非法访问,数组越界
硬件异常:计算的硬件设备在运行期间出现问题。

捕获错误:当程序运行时,遇到异常时,用户捕获错误,并自处理(而并不是由系统来处理(会直接退出))

try

{
捕获错误语句块

}

catch(错误分支1)

{

}

catch(错误分支2)

{

}

throw抛出问题---与catch的类型进行匹配。

C++调用函数时不仅需要此函数的声明(告诉编译器,此语句是用于调用函数),还需要将此函数的函数链接成此程序的一部分。

编写程序-->运行程序的过程
1、预处理   gcc -E   
2、汇编     gcc -S
3、编译     gcc  -c将某个源文件编译成目标文件(二进制指令).o
4、链接     gcc 库/.c/.o 将需要的函数体等链接成可执行文件。

静态库,动态库:
静态库:成为可执行文件的一部分(在链接时,将编译器将此库链接成为程序的一部分)
优点:不会因此库文件的丢失而运行失败   缺点:维护与更新困难。
动态库:不会成为程序的一部分(当此程序需要某个模块时,系统此时才会将此程序导入到内存,并调用此函数。当此模块不再需要使用时,系统会释放此模块)
优点:更新与维护简
缺点:当库文件丢失时,可能会造成运行失败

静态库:存储的是目标文件并打包成一个库文件
步骤:
1、编译源文件1
源文件2  
2、编译成目标文件1 目标文件2 。。。
(是具有执行能力)
3、打包成静态库: lib***.a(gcc/g++ 需要指定格式的包文件,且名字也规定命名:lib库文件名.a)  
(*)提供库文件与头文件
4、链接 :gcc/g++ 源文件.c。。。 [-L path ]  -l库文件名  -o 输出文件

gcc  test.c -L./ -lm  -o a.out
去链接当前路径下(./) 下的libm库
gcc  test.c -lm  -o a.out
去链接系统环境变量的路径下(PATH) 下的libm库

动态库:并不是编译时将动态库链接成为可执行文件的一部,而在运行时需要此动态库时才导入此库文件。
步骤1
1、编写源文件
2、生成可执行能力的库文件
gcc/g++ -fPIC -shared 源文件 -o lib库文件名.主版本号.次版本号.so
3、(加载) 共享加载   动态加载
共享加载:编译时指定动态库

gcc/g++ -L. -l库文件名  源文件 -o 可执行文件

注:每个进程中都有一个LD_LIBRARY_PATH变量(在需要此库进文件,系统会在按照进程的LD_LIBRARY_PATH路径中去搜索此库文件),会系统路径下查找。如果再查找不到,则报出错误
添加此库的路径
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH;./"
注:如果两个库(动态库与静态库)同时存在(同名),以动态库优先。

nm-->列出符号名的关系
nm -s 静态库

ldd-->查找可执行文件的库依赖关系
ldd 可执行文件.

    动态加载:当需要调用此函数时,用户可以去动态的将此库加载到内存中;当调用完成时,可以释放此库
1  加载库文件 dlopen
void *dlopen(const char *filename, int flag);  //动态库名
2  查找此库中指定的符号名(函数名)
3  调用
4  释放 

work:

1、将冒泡排序算法(非模板函数)封装成库:动态库,静态库

2、将双向链表类封装成库:动态库,静态库。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: