【问题标题】:Link one shared library static to my shared library将一个共享库静态链接到我的共享库
【发布时间】:2010-05-18 15:33:31
【问题描述】:

我正在为链接我目前正在从事的项目的一些选项而苦苦挣扎:

我正在尝试创建一个与其他 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++ 专家,如果这个问题看起来很愚蠢,请见谅。

【问题讨论】:

标签: c++ linux gcc linker


【解决方案1】:

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

  • 静态库 (*.a) 是与应用程序链接并成为应用程序一部分的目标代码档案。它们是使用ar(1) 命令创建的并且可以使用ar -t libfoo.a 命令进行操作(即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 

【讨论】:

    猜你喜欢
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多