在将代码打包为库时,我应该创建.a还是.so?

Fra*_*ank 2 c++ linker shared-libraries

我有一个软件库,我曾经创建.a文件,以便人们可以安装它们并链接它们: g++ foo.o -L/path/to -llibrary

但是现在我经常遇到只有.so文件可用的第三方库(而不是.a),你只需要在没有-l开关的情况下链接它们,例如g++ foo.o /path/to/liblibrary.so.

这些解决方案之间有什么区别?我是否应该为我的图书馆用户创建.so文件?

Rya*_*oun 9

通常,libfoo.a是一个静态库,并且libfoo.so是一个共享库.您可以对静态或共享使用相同-L/ -l链接器选项.或者,您可以使用static或shared命名lib的完整路径.通常,库既是静态的,也是共享的,以便为应用程序开发人员提供他们想要的选择.

静态库所需的所有代码都是最终可执行文件的一部分.这显然使它更大,但它也意味着它是独立的.编译完成后,您可以在没有lib的情况下运行应用程序.

共享库中的代码不是可执行文件的一部分.只有一些钩子可以使可执行文件知道它需要的lib的名称.为了运行您的应用程序,共享库必须存在于lib搜索路径中(例如$LD_LIBRARY_PATH).

如果您有两个共享相同代码的应用程序,则每个应用程序都可以链接到共享库以保持二进制文件大小不变.如果你想升级应用程序的某些部分而不重建整个东西,那么共享库也是有益的.