http://www.linuxsir.org/main/doc/gnumake/GNUmake_v3.80-zh_CN_html/make-11.html
更 新静态库的符号索引表
本小节的内容相对简单。前边提到过,静态库文件需要使用“ar”来创建和维护。当给静态库增建一个成员时(加入一 个.o文件到静态库中),“ar”可直接将需要增加的.o文件简单的追加到静态库的末尾。之后当我们使用这个库进行连接生成可执行文件时,链接程序 “ld”却提示错误,这可能是:主程序使用了之前加入到库中的.o文件中定义的一个函数或者全局变量,但连接程序无法找到这个函数或者变量。
这 个问题的原因是:之前我们将编译完成的.o文件直接加入到了库的末尾,却并没有更新库的有效符号表。连接程序进行连接时,在静态库的符号索引表中无法定位 刚才加入的.o文件中定义的函数或者变量。这就需要在完成库成员追加以后让加入的所有.o文件中定义的函数(变量)有效,完成这个工作需要使用另外一个工 具“ranlib”来对静态库的符号索引表进行更新。
我们所使用到的静态库(文档文件)中,存在这样一个特殊的成员,它的名字是 “__.SYMDEF”。它包含了静态库中所有成员所定义的有效符号(函数名、变量名)。因此,当为库增加了一个成员时,相应的就需要更新成员 “__.SYMDEF”,否则所增加的成员中定义的所有的符号将无法被连接程序定位。完成更新的命令是:
inux下编译静态库的时候,ar不带任何选项打包成.a文件后,对其进行ranlib操作有 什么用,如果不进行ranlib操作会有什么后果,我编译的时候没用这步操作也能正常运行,请达人给讲解一下。谢谢。http://www.linuxsir.org/main/doc/gnumake/GNUmake_v3.80-zh_CN_html/make-11.html 更 新静态库的符号索引
库文件名都是以lib开头的,
静态库
以a作为后缀,表示archive。
创建
静态库
:
ar rs libstack.a stack.o push.o pop.o is_empty.o
ar把目标文件打包成
静态库
;
r表示将后面的文件列表添加到文件包,若果文件包不存在就创建它;
s是专用于生成
静态库
的,表示为
静态库
创建索引,这个索引被连接器
使用
。
ranlib
命令也可以为
静态库
创建索引。
...
这次编译真的是惨痛的经历.先是经历了
linux
空间不足,然后是编译报错
/bin/sh:
ranlib
/usr/local/lib/libavdevice.a: No such file or directory
这个问题就是
LIB_INSTALL_EXTRA_CMD='$$(
RANLIB
)"$(LIBDI...
作者:gavinpong,相关源码可以在github仓库下载到,欢迎fork 与 交流:https://github.com/GavinPong
所有组件都可以在minigui官网上下载到:http://www.minigui.com/zhcn/download/
下载miniGUI3.2.0组件
简单介绍一下各个库:
freetype:字体
qvfb2和gvfb...
参考:http://study.chyangwa.com/IT/AIX/aixcmds1/ar.htm#a0949a5b
摘自:http://hi.baidu.com/doyee/blog/item/ad4c4a341089ed47251f1484.html
摘自:http://hi.baidu.com/kkernel/blog/item/e729cffa9036318e9f51465
Compile ffmpeg for Android
Before Continuing this page, if u want to enable x264, please complete building x264 using android toolchain first. Check
this.
Please put x264 folder at same level of
In file included from libavfilter/aeval.c:26:0:
./libavutil/avassert.h:30:20: fatal error: stdlib.h: No such file or directory
#include <...
1. 什么是
静态库
?什么是动态库?
-
静态库
是在编译时被链接到可执行文件中的库,它包含了所有的函数和数据,因此可执行文件较大,但运行时不需要加载额外的库文件。
- 动态库是在程序运行时被加载的库,它包含了多个可执行文件可以共享的函数和数据,因此可执行文件较小,但需要在运行时加载额外的库文件。
2.
静态库
和动态库的优缺点是什么?
-
静态库
的优点是可靠性高,因为所有的代码都被编译到可执行文件中,不需要额外的库文件。缺点是可执行文件较大,占用磁盘空间较大,且无法在运行时更新库文件。
- 动态库的优点是可执行文件较小,因为共享库文件可以被多个可执行文件共享。缺点是依赖性高,因为需要在运行时加载库文件,如果缺少或版本不匹配会导致程序无法运行。
3. 动态库的加载过程是怎样的?
- 当程序需要访问动态库中的函数或数据时,操作系统会检查可执行文件的依赖关系,加载动态库文件到内存中,并在符号表中查找相应的函数或数据。
- 如果找到了相应的函数或数据,程序就可以调用库函数或访问库数据。如果没有找到,操作系统会抛出未定义符号的错误。
4. 如何编译
静态库
和动态库?
- 编译
静态库
可以
使用
命令"ar"和"
ranlib
",例如:
gcc -c file1.c file2.c
ar rcs libmylib.a file1.o file2.o
- 编译动态库可以
使用
命令"gcc"和"-shared"选项,例如:
gcc -c -fpic file1.c file2.c
gcc -shared -o libmylib.so file1.o file2.o
5. 如何
使用
静态库
和动态库?
-
使用
静态库
可以在编译时链接库文件,例如:
gcc -o myprog main.c -L/path/to/lib -lmylib
-
使用
动态库可以在程序运行时加载库文件,例如:
LD_LIBRARY_PATH=/path/to/lib ./myprog
6. 如何避免动态库版本不匹配的问题?
- 在编译动态库时,可以
使用
版本号来标识不同的库版本,例如:
gcc -shared -Wl,-soname,libmylib.so.1 -o libmylib.so.1.0.0 file1.o file2.o
- 在程序中调用库函数时,可以
使用
版本号来指定库版本,例如:
dlopen("libmylib.so.1", RTLD_NOW);
这样可以确保程序
使用
正确的库版本,并避免版本不匹配的问题。