概述
静态库的本质就是将多个目标文件打包成一个文件。在使用时链接静态库就是将库中被调用的代码复制到调用模块中。
动态库又名共享库,和静态库最大的不同就是,链接共享库并不需要将库中被调用的代码复制到调用模块中,相反被嵌入到调用模块中的仅仅是被调用代码在共享库中的相对地址。如果共享库中的代码同时为多个进程所用,共享库的实例在整个内存空间中仅需一份,这也正是共享的意义所在。
注意
- 开发环境:vxWorks6.9.4,workbench3.3.5。
- 静态库优点是使用静态库的代码在运行时无需依赖库,且执行效率高,缺点是静态库占用空间大,库中代码一旦修改必须重新链接。
- 动态库的优点是占用空间小,即使修改了库中的代码,只要接口保持不变,无需重新链接,缺点是使用动态库的代码在运行时需要依赖库,执行效率略低。
- 另外,小编所有文章均是自己亲手编写验证,若需要小编的工程代码,点击“实时系统vxWorks - 动态库、静态库建立及调用工程文件”获取。
建立库
建立动态库
1. 在Project Explorer窗口空白处右键,选择New->VxWorks Downloadable Kernel Module Project。
2. 输入Project name,选择Create project in workspace,然后点击Next。
3. 一路点击Next,直到出现如下界面,选择Active build spec为SIMNT diab,然后点击Next。
4. 选择Build tool:Linker(动态库),然后点击Finish。
5. 新建add.c和add.h文件,输入以下内容。
add.c
/**
* @Filename : add.c
* @Revision : $Revision: 1.00 $
* @Author : Feng(更多编程相关的知识和源码见微信公众号:不只会拍照的程序猿,欢迎订阅)
* @Description : 动态库示例,实现加法功能
**/
int add(int a, int b)
{
return (a + b);
}
add.h
/**
* @Filename : add.h
* @Revision : $Revision: 1.00 $
* @Author : Feng(更多编程相关的知识和源码见微信公众号:不只会拍照的程序猿,欢迎订阅)
* @Description : 动态库示例,实现加法功能
**/
#ifndef __ADD_H__
#define __ADD_H__
int add(int a, int b);
#endif
6. 右键工程,选择Rebuild Project,编译工程。
7. 等待编译结束
8. 打开目录,查看动态库文件。
9. 拷贝动态库文件到ftp目录,方便后期加载。
建立静态库
1. 类似动态库的建立过程,唯一的区别就是在Build tool处选择Librarian(静态库)。
2. 同样新建sub.c和sub.h,输入以下内容。
sub.c
/**
* @Filename : sub.c
* @Revision : $Revision: 1.00 $
* @Author : Feng(更多编程相关的知识和源码见微信公众号:不只会拍照的程序猿,欢迎订阅)
* @Description : 静态库示例,实现减法功能
**/
int sub(int a, int b)
{
return (a - b);
}
sub.h
/**
* @Filename : sub.h
* @Revision : $Revision: 1.00 $
* @Author : Feng(更多编程相关的知识和源码见微信公众号:不只会拍照的程序猿,欢迎订阅)
* @Description : 静态库示例,实现减法功能
**/
#ifndef __SUB_H__
#define __SUB_H__
int sub(int a, int b);
#endif
3. 编译工程,等待编译结束。
4. 打开目录,查看静态库文件。
调用库
1. 建立应用工程
方法与建立动态库一致,新建main函数,调用动态库里的add函数和静态库的sub函数。
注意:本项目的应用工程本身也是动态库。
main.c
/**
* @Filename : main.c
* @Revision : $Revision: 1.00 $
* @Author : Feng(更多编程相关的知识和源码见微信公众号:不只会拍照的程序猿,欢迎订阅)
* @Description : 动态库、静态库调用示例
**/
#include
#include
#include "stdioLib.h"
#include "sub.h"
#include "add.h"
int main(void)
{
int a = 10, b = 5;
printf("%d + %d = %d\n", a, b, add(a, b));
printf("%d - %d = %d\n", a, b, sub(a, b));
}
2. 右键工程选择Properties。
3. 选择Libraries,点击Add添加库。
4. 选择Add full qualified library file,点击Browse...,找到静态库,双击打开。
5. 添加完成后,点击OK。
6. 此时,我们已将静态库加入到工程中。点击OK,关闭对话框。
7. 回到工程目录,右键工程,选择Rebuild Project,编译工程。
8. 等待编译完成
9. 拷贝目标文件到ftp目录。
10. 启动vxWorks。
11. 加载动态库文件和应用程序库文件。
注意:动态库还可以通过代码的方式加载和调用,具体参照小编文章《实时系统vxWorks - 加载应用程序的方法》。
12. 输入入口函数main,运行应用程序。
13. 可以看到,已经正确执行了加法和减法,表示此时我们已经正确调用了动态库和静态库文件。