一个静态库若是调用了另外一个静态库的函数,在编译这个静态库的时候,只是会去找这个函数的声明,不会管这个函数是否有实现。所以在使用这个静态库的时候,得配合它所用的函数所在的静态库一起使用。
编译的时候找不到实现不会报错,但是链接的时候如果这个函数没有实现,则会报undefined错误。
静态库A源文件
int func_A()
{
func_B_in_lib_B();
}
此时只要找到func_B_in_lib_B()的声明就不会报错了。
静态库的链接顺序也有讲究,顺序不对,将会出现未定义错误。
在动态链接和静态链接的语义上有一个巨大差别,archive(静态库)与共享对象(动态库)的动作不同。在动态链接中,所有的库符号进入输出文件的虚拟地址空间中,所有的符号对于链接在一起的所有文件都是可见的。相反,对于静态链接,在处理archive时,它只是在archive中查找载入器当时所知道的未定义符号。因此,使用静态链接的过程中,引入静态链接库的顺序是很重要的。如果相同的符号在两个不同的静态链接库中都有定义,那么静态库出现的顺序不同,编译的结果就可能不同。
如果在自己的代码之前引入静态库,又会带来一个问题。因为此时尚未出现未定义的符号,所以它不会从库中提取任何符号。接着,当用户程序生成的目标文件被链接时,它的所有对函数库的引用都将是未实现的!因此,在进行编译时,始终将-l函数库选项放在编译命令选项的最右边
所以最原始的库,要放在最后面。比如这次libw使用了libnand的函数,链接顺序应该是这样:
-lw -lnand。