嵌入式每日学习心得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、将双向链表类封装成库:动态库,静态库。
运行程序时,系统会将运行的执行权递交给程序,一当遇到异常,系统会回收此执行权(停止程序的运行,并报出错误)
异常:
软件异常:除数为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、将双向链表类封装成库:动态库,静态库。
相关文章推荐
- 嵌入式每日学习心得2017.07.14
- 嵌入式每日学习心得2017.08.02
- 嵌入式每日学习心得2017.07.31
- 嵌入式每日学习心得2017.07.10
- 嵌入式每日学习心得2017.08.08
- 嵌入式每日学习心得 线程
- 嵌入式每日学习心得 网络通信技术(TCP)
- 嵌入式每日学习心得2017.07.24
- 嵌入式每日学习心得2017.07.21
- 嵌入式每日学习心得2017.07.28
- 嵌入式每日学习心得2017.08.17
- 嵌入式每日学习心得2017.07.11
- 嵌入式每日学习心得2017.07.13
- 嵌入式每日学习心得2017.07.17
- 嵌入式每日学习心得2017.08.01
- 嵌入式每日学习心得 基于TCP/IP的聊天室程序
- 嵌入式每日学习心得2017.07.12
- 嵌入式每日学习心得2017.08.03
- 嵌入式每日学习心得2017.07.25
- 嵌入式每日学习心得2017.08.15