将一个共享库static链接到我的共享库

时间:2010-05-18 15:33:32

标签: c++ linux gcc linker

我正在讨论一些关于我正在进行的项目的链接的选项:

我正在尝试创建一个与其他2个库链接的共享库。 (让我们称他们为libfoo.solibbar.so
我的输出库必须是一个共享库,我想将静态链接libfoo.so添加到生成的库中,但libbar.so应该作为动态库链接。 (libbar.so应该在libfoo.so不可用的每台计算机上都可用,我不希望用户将其安装/发送给我的二进制文件。)

我如何存档?

我当前的构建说明如下所示:

c++ -Wall -shared -c -o src/lib.o src/lib.cpp
c++ -Wall -shared -o lib.ndll src/lib.o -lfoo -lbar

我的辩护:我不是c / c ++专家,如果这个问题看起来很愚蠢,那就很抱歉。

1 个答案:

答案 0 :(得分:10)

有两种Linux C / C ++库类型。

  • 静态库(*.a)是目标代码的归档,它们与应用程序链接并成为其中的一部分。使用ar(1)命令创建它们并进行操作(即ar -t libfoo.a将列出库/存档中的文件)。

  • 动态链接的共享对象库(*.so)可以通过两种方式使用。

    1. 共享对象库可以在运行时动态链接,但可以静态识别。在编译/链接阶段,库必须可用。共享对象不包含在二进制可执行文件中,但与执行相关联。
    2. 可以使用动态链接加载器系统函数在执行期间动态加载/卸载共享对象库并进行链接。

为了将libfoo.so静态链接到二进制文件中,您需要一个通常称为libfoo.a的相应静态库。在创建程序可执行文件时,可以通过在编译和链接过程中调用静态库来使用静态库。

结果是将构建命令更改为以下内容:

g++ -Wall -fPIC -c -o src/lib.o src/lib.cpp
g++ -shared -Wl,-soname,mylib.so.1 -o mylib.so.1 src/lib.o -L/path/to/library-directory -lbar libfoo.a