将一个共享库静态链接到我的共享库

我正在努力一些有关链接我正在进行的项目的一些选项:

我正在尝试创build一个与其他两个库链接的共享库。 (让我们称他们为libfoo.solibbar.so
我的输出库必须是一个共享库,我想静态链接libfoo.so到结果库,但libbar.so应链接为一个dynamic库。 ( libbar.so应该在每台机器上都可用, libfoo.so不可用,我不希望用户安装它/将其与我的二进制文件一起发送。)

我怎么能把这个存档?

我目前的构build指令是这样的:

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

我的防守:我不是AC / C ++专家,所以如果这个问题看起来很愚蠢,那么对不起。

Solutions Collecting From Web of "将一个共享库静态链接到我的共享库"

有两种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