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

The*_*ppo 3 c++ linux linker gcc

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

我正在尝试创建一个与其他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
Run Code Online (Sandbox Code Playgroud)

我的辩护:我不是ac/c ++专家,很抱歉,如果这个问题似乎很愚蠢.

jsc*_*ier 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 
Run Code Online (Sandbox Code Playgroud)