为什么静态库可以依赖共享库?
Why a static library can depend on a shared a library?
据我所知,静态库不能依赖Linux中的共享库。但是,当我编译链接到 glog.a 和 gflags.a 的程序时,编译器会报告以下错误:
> /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libglog.a(libglog_la-utilities.o):
> In function `google::GetStackTrace(void**, int, int) [clone .part.7]':
> (.text+0xad): undefined reference to `_Ux86_64_getcontext'
> (.text+0xb8): undefined reference to `_ULx86_64_init_local'
> (.text+0xe7): undefined reference to `_ULx86_64_step' (.text+0x100):
> undefined reference to `_ULx86_64_get_reg' (.text+0x120): undefined
> reference to `_ULx86_64_step' collect2: error: ld returned 1 exit
> status
此编译错误也已通过链接 unwind.so 解决。但是我觉得奇怪的是为什么 libglog.a 会依赖共享库?这不是不可能吗?
这个声明
a static library cannot depend on a shared library in Linux
完全错误。
静态库只是目标文件的集合。
如果您可以使用从编译为 .o
文件的共享库导入的代码,您可以将这些 .o
文件收集到一个库中,现在您有一个使用从中导入的库共享库。
与直接链接所有目标代码相比,静态库唯一真正的区别是该库包含一个符号索引,链接器使用该索引来决定库中的哪些目标文件需要链接。而直接传递给链接器的目标文件总是被链接进来。这对全局初始化程序行为有重要影响,其他很少。
据我所知,静态库不能依赖Linux中的共享库。但是,当我编译链接到 glog.a 和 gflags.a 的程序时,编译器会报告以下错误:
> /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libglog.a(libglog_la-utilities.o):
> In function `google::GetStackTrace(void**, int, int) [clone .part.7]':
> (.text+0xad): undefined reference to `_Ux86_64_getcontext'
> (.text+0xb8): undefined reference to `_ULx86_64_init_local'
> (.text+0xe7): undefined reference to `_ULx86_64_step' (.text+0x100):
> undefined reference to `_ULx86_64_get_reg' (.text+0x120): undefined
> reference to `_ULx86_64_step' collect2: error: ld returned 1 exit
> status
此编译错误也已通过链接 unwind.so 解决。但是我觉得奇怪的是为什么 libglog.a 会依赖共享库?这不是不可能吗?
这个声明
a static library cannot depend on a shared library in Linux
完全错误。
静态库只是目标文件的集合。
如果您可以使用从编译为 .o
文件的共享库导入的代码,您可以将这些 .o
文件收集到一个库中,现在您有一个使用从中导入的库共享库。
与直接链接所有目标代码相比,静态库唯一真正的区别是该库包含一个符号索引,链接器使用该索引来决定库中的哪些目标文件需要链接。而直接传递给链接器的目标文件总是被链接进来。这对全局初始化程序行为有重要影响,其他很少。