至少在 Linux 和 Solaris 上,静态库实际上只是一堆已编译的 .o 文件,它们被扔进一个大文件中。编译静态库时,通常会省略 -fpic 标志,因此生成的代码是位置相关的。
现在说我的静态库是 B。我已经构建了它并得到了生成的 .a 文件,它实际上只是所有与位置相关的 .o 文件的全局。现在我有一个我想构建的共享库A,我希望它静态链接B。当我构建A时,我自然会使用-fpic标志来使生成的代码位置独立。但是如果我链接到 B,我不是混合了位置相关和位置无关的目标文件吗?
除非我还指定 -mimpure-text,否则我会收到很多文本重定位错误,我认为这可能是原因。看来我编译一个库的时候,真的需要编译3次,一个共享版本,一个静态版本,一个static-that-can-be-used-by-shared-libs版本。我对吗?我可以继续使用 -mimpure-text 但 g++ 手册页说,如果你这样做,对象实际上并没有最终被共享(不清楚它是全部未共享还是只是静态链接的部分,有人知道吗?) .