嵌入式系统中动态静态库的使用与生成

需积分: 10 2 下载量 147 浏览量 更新于2024-08-01 收藏 145KB DOC 举报
"嵌入式系统中如何使用和生成库" 在嵌入式系统开发中,库文件是代码复用和模块化的重要工具。库分为动态库(Dynamic Library)和静态库(Static Library)。动态库通常以`.so`(Shared Object)为后缀,如`libhello.so`,而静态库则以`.a`(Archive)为后缀,例如`libhello.a`。 动态库允许在运行时加载和卸载,有助于节省磁盘和内存空间,因为多个程序可以共享同一份库的内存副本。动态库文件可能带有版本号,如`libhello.so.1.0`,为了方便使用,通常会创建符号链接,例如`libhello.so.1`和`libhello.so`,使得程序在链接时能正确找到库文件。 使用动态库时,程序在运行前并不包含库的代码,而是在运行时通过`ldd`等工具动态加载。如果程序需要与静态库连接,编译器会在链接阶段将库中的函数代码直接复制到可执行文件中,因此生成的可执行文件较大,但不需要运行时依赖外部库。 以一个名为`hello`的程序包为例,它包含一个静态库`libhello.a`、一个动态库`libhello.so`以及头文件`hello.h`,头文件定义了`sayhello()`函数。要使用这个库,开发者需要编写一个调用该函数的源文件,比如`testlib.c`,并进行编译和链接。 如果要与动态库`libhello.so`连接,可以使用以下命令: ```bash $ gcc -c testlib.c -o testlib.o $ gcc testlib.o -lhello -o testlib ``` 这里,`-lhello`告诉编译器链接`libhello`库,而`-o`指定输出文件。 与静态库`libhello.a`连接时,命令会有所不同,需要额外的选项指示编译器链接静态库: ```bash $ gcc -c testlib.c -o testlib.o $ gcc testlib.o -Wl,-Bstatic -lhello -o testlib ``` 这里的`-Wl,-Bstatic`是传递给链接器`ld`的选项,指示它链接静态库。如果库文件不在默认路径`/usr/lib`下,还需要使用`-L`参数指定库的路径。 总结来说,嵌入式系统中的库使用和生成涉及动态库和静态库的选择,以及相应的编译和链接选项。动态库节省空间,便于系统升级,而静态库在不需要运行时依赖的情况下更为稳定。理解这些概念对于嵌入式开发至关重要,因为它直接影响到程序的大小、运行效率和可移植性。
2012-03-02 上传
从事嵌入式开发的程序员都知道,各种各样的库文件处理是一件烦琐累人的工作,不管你采用的是资源缺乏的单片机,还是高级一些的处理器如arm7,arm9,powerpc等,为了实现产品在声音,图象,信息记录各方面的功能,你都不得不花费大量的时间将零散的,不同格式的音效文件,位图文件,动画文件,视频文件,字库文件,记录文件等分门别类的组织,拼接成各种库文件,以便于下载并烧录到FLASH或者EEPROM中去,拼接过程中,你必须小心的提取和保存诸如文件长度和偏移量这些定位信息,并在INC文件或头文件中定义它们,以便在需要时能够正确的调用这些文件;或者你必须在库文件前面加上信息头,存放库中包含的文件地址,文件长度,和文件名等索引信息,使得应用程序可以快速搜索到需要的文件; 当几十,上百,甚至上千的文件需要逐一拼接,提取并保存定位信息的时候,即使是最简单的重复操作也是一个庞大的工作量,而库文件的修改更是一个危险的操作,因为任何一个文件的长度和排序的变化都意味着必须重新拼接库文件,重新提取,保存和定义各个文件的地址和长度,修改相应的头文件和文件清单;其中任何一个环节出错就会导致灾难性的后果,所以对于缺少手段的小公司来说,在很多情况下,库文件一旦建立就不会改动,即便逼不得以也宁愿在尾部添加新的替代文件,通过修改程序的办法来让指针指向新的替代文件,也不会去修改错误的文件;因为程序的编译链接是自动进行的,避免了人工操作出错的可能;而对库文件进行人工操作时的出错几率则必然会导致工程的延误和费用开销的增加。 出于对上述事实的认知和人类偷懒的天性,我麻烦自己编写了一个小工具,"LIBPRO",可以用来瞬间解决上文中提到的各种麻烦;因为怕麻烦而先承受麻烦,然后在以后的工作中可以少一些麻烦,这个因果关系不正是研发过程的真实写照吗?